gpt4 book ai didi

c# - 断言两种不同类型的枚举是等价的

转载 作者:太空狗 更新时间:2023-10-29 21:54:09 28 4
gpt4 key购买 nike

我有一个 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) 必须使用某些谓词来确定匹配项之间的等价性。

最佳答案

让我们想想您要测试的是什么。您不是要测试第一个序列中的对象是否与第二个序列中的对象相同。它们可以非常不同。所以,similar 这个词在这里非常模糊。您真正要在这里测试的是,第一个序列的某些投影等于第二个序列的其他投影。而 NUnit 已经具备这样的功能:

 CollectionAssert.AreEqual(bunchOfAs.Select(a => a.ToString()),
bunchOfBs.Select(b => b));

因此,您投影两个序列以获得特定数据,然后您可以为这两个投影命名,这将使您的测试对其他人可读。这里有一些隐藏的业务逻辑,代码中没有解释 - 你没有解释为什么你做出这样的预测。因此,投影结果的好名字将解释您的意图。例如:

 var expectedNames = employees.Select(u => u.Login);
var actualNames = customers.Select(c => c.Name);
CollectionAssert.AreEqual(expectedNames, actualNames);

这对我来说比

干净多了
 Assert.IsPrettySimilar(employees, customers, (e, c) => u.Login == c.Name);

关于c# - 断言两种不同类型的枚举是等价的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22458770/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com