如何在c#中创建涉及集合的单元测试?

时间:2009-07-30 07:11:00

标签: c# unit-testing collections

我在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等,我必须编写一些签名。是否存在简化此操作的转换(例如,将数组转换为Set?)。

我还需要为自己的课程这样做。我已经为他们实现了HashCode和Equals。它们(主要)是(比如)MySuperClass的子类。是否可以实现该功能:

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

这样我可以打电话:

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

而不是为每个班级写这个

3 个答案:

答案 0 :(得分:8)

NUnit和MSTest(可能还有其他的)都有一个CollectionAssert类

答案 1 :(得分:4)

如果您使用的是.NET 3.5,则可以使用Enumerable.SequenceEqual方法。

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

如果你只关心元素是否相等而不是顺序,你应该在调用SequenceEqual之前在两个序列上使用OrderBy。

答案 2 :(得分:0)

您是否尝试过使用NUnit附带的CollectionAssert

它断言两个集合并比较集合中的项目

相关问题