Как я могу создавать модульные тесты, включающие коллекции на C #?

У меня есть несколько методов на C #, которые возвращают различные коллекции, которые я хочу протестировать. Я хотел бы использовать как можно меньше тестовых API - производительность не важна. Типичный пример:

HashSet<string> actualSet = MyCreateSet();
string[] expectedArray = new string[]{"a", "c", "b"};
MyAssertAreEqual(expectedArray, actualSet);

//...

void MyAssertAreEqual(string[] expected, HashSet<string> actual)
{
    HashSet<string> expectedSet = new HashSet<string>();
    foreach {string e in expected)
    {
        expectedSet.Add(e);
    }
    Assert.IsTrue(expectedSet.Equals(actualSet));
}

Мне нужно написать несколько подписей в зависимости от того, являются ли коллекции массивами, списками, ICollections и т. Д. Существуют ли преобразования, упрощающие это (например, для преобразования массива в набор?).

Мне также нужно сделать это для моих собственных классов. Я реализовал для них HashCode и Equals. Они (в основном) являются производными от (скажем) MySuperClass. Можно ли реализовать функционал:

void MyAssertAreEqual(IEnumerable<MySuperClass> expected, 
                      IEnumerable<MySuperClass> actual); 

так что я могу позвонить:

IEnumerable<MyClassA> expected = ...;
IEnumerable<MyClassA> actual = ...; 
MyAssertAreEqual(expected, actual); 

вместо того, чтобы писать это для каждого класса


person peter.murray.rust    schedule 30.07.2009    source источник


Ответы (3)


И NUnit, и MSTest (возможно, и другие) имеют класс CollectionAssert

person jeroenh    schedule 30.07.2009
comment
Спасибо (думаю, я использую MSTest). Похоже, это то, что мне нужно. Мы планируем перейти на NUnit RSN - person peter.murray.rust; 30.07.2009

Если вы используете .NET 3.5, вы можете использовать метод Enumerable.SequenceEqual.

Assert.IsTrue(seqA.SequenceEqual(seqB));

Вы должны использовать OrderBy для обеих последовательностей до вызова SequenceEqual, если вас интересует только равенство элементов, а не порядок.

person Mike Two    schedule 30.07.2009
comment
Разве это не должно быть Enumerable.SequenceEqual вместо IEnumerable? - person Michael; 30.07.2009
comment
@Michael: Это метод расширения, так что вы можете просто использовать seqA.SequenceEqual(seqB). очень важно отметить, что вам нужно использовать OrderBy(...), чтобы иметь значимые сравнения (вы заботитесь о существовании элементов, но не о порядке). - person Sam Harwell; 30.07.2009
comment
Отредактированный ответ, чтобы отразить хорошие предложения от @Michael и @ 280Z28 - person Mike Two; 30.07.2009

Вы пробовали использовать CollectionAssert, поставляемый с NUnit.

Он утверждает две коллекции и сравнивает элементы в коллекции.

person AutomatedTester    schedule 30.07.2009