2009-07-30 52 views
4

我在C#中有很多方法可以返回我想测试的各种集合。我想尽可能少地使用测试API--性能并不重要。一个典型的例子是:如何在c#中创建涉及集合的单元测试?

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); 

,而不是写本,每类

回答

4

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

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

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

+1

它不应该Enumerable.SequenceEqual而不是IEnumerable? – Michael 2009-07-30 07:20:04

+1

@Michael:这是一个扩展方法,所以你可以使用`seqA.SequenceEqual(seqB)`。注意你需要使用`OrderBy(...)`进行有意义的比较(你关心元素的存在,而不是关于顺序),这是非常重要的*。 – 2009-07-30 07:25:48