我想要像这样的测试:
[Test]
public void TestCollectionAssert ()
{
var a1 = new [] { new [] { "a" } };
var a2 = new [] { new [] { "a" } };
Assert.AreNotEqual (a1, a2);
//CollectionAssert.AreEqual (a1, a2);
CollectionAssert.AreEquivalent (a1, a2);
}
通过.
我的实际案例更复杂,但以通用方式解决这个问题就行了.
有任何想法吗?
最佳答案 有一个名为
SequenceEqual()
的有用LINQ运算符,用于比较两个序列的相等性. SequenceEqual()遍历任何两个IEnumerable<>序列并验证它们具有相同数量的元素,并且相同索引处的元素相等(使用默认的相等比较器).但是,由于您具有嵌套集合,因此您还需要扩展相等概念以应用于它们.幸运的是,有一个重载允许您提供自己的IEqualityComparer<>宾语.
由于不断定义一个提供相等语义的类很尴尬,我编写了一个允许你使用委托的通用扩展.我们来看看代码:
public static class ComparerExt
{
private class GenericComparer<T> : IEqualityComparer<T>
{
private readonly Func<T, T, bool> m_EqualityFunc;
public GenericComparer( Func<T,T,bool> compareFunc )
{
m_EqualityFunc = compareFunc;
}
public bool Equals(T x, T y)
{
return m_EqualityFunc(x, y);
}
}
// converts a delegate into an IComparer
public static IEqualityComparer<T> AreEqual<T>( Func<T,T,bool> compareFunc )
{
compareFunc.ThrowIfNull("compareFunc");
return new GenericComparer<T>(compareFunc);
}
}
现在,我们可以很容易地比较两个序列:
Assert.IsTrue(
// check that outer sequences are equivalent...
a1.SequenceEqual( a2,
// define equality as inner sequences being equal...
ComparerExt.AreEqual( (a,b) => a.SequenceEqual(b) ) );