我有一个 NUnit 单元测试,其中我有两个不同类型的集合,我想要断言它们是等价的。
class A { public int x; }
class B { public string y; }
[Test]
public void MyUnitTest()
{
var a = GetABunchOfAs(); // returns IEnumerable<A>
var b = GetABunchOfBs(); // returns IEnumerable<B>
Assert.IsPrettySimilar(a, b, (argA, argB) => argA.ToString() == argB);
}
这里的 Assert.IsPrettySimilar
是这样定义的:
public static void IsPrettySimilar<T1, T2>(
IEnumerable<T1> left,
IEnumerable<T2> right,
Func<T1, T2, bool> predicate)
{
using (var leftEnumerator = left.GetEnumerator())
using (var rightEnumerator = right.GetEnumerator())
{
while (true)
{
var leftMoved = leftEnumerator.MoveNext();
if (leftMoved != rightEnumerator.MoveNext())
{
Assert.Fail("Enumerators not of equal size");
}
if (!leftMoved)
{
break;
}
var isMatch = predicate(leftEnumerator.Current,
rightEnumerator.Current);
Assert.IsTrue(isMatch);
}
}
}
我的问题是,使用NUnit的现有方法是否有更习惯用法的方式来完成上述操作?我已经查看了
CollectionAssert
,但没有任何匹配我想要做的事情。在这种情况下,我对“等效”的描述如下:
1)集合必须具有相同的大小
2)集合必须按照相同的逻辑顺序排列
3)必须使用某些谓词来确定匹配项之间的等价性。
CollectionAssert.AreEqual
验证项的数量和顺序 - 当一个序列缺少项 (即比另一个短) 或当某些项不相等时,它将抛出断言异常 (它的内部实现EnumerablesEqual
几乎与您的扩展方法相同,除了使用谓词)。 - Sergey Berezovskiy