Как я могу создать модульные тесты с участием коллекций в C #? - PullRequest
4 голосов
/ 30 июля 2009

У меня есть ряд методов в 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); 

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

Ответы [ 3 ]

8 голосов
/ 30 июля 2009

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

4 голосов
/ 30 июля 2009

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

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

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

0 голосов
/ 30 июля 2009

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

Утверждает против двух коллекций и сравнивает элементы в коллекции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...