NUnit 3中使用TestCaseData.Returns()能否忽略IEnumerable元素顺序?
在NUnit 3中用TestCaseData.Returns()忽略IEnumerable元素顺序的方法
在NUnit 3中,TestCaseData.Returns()默认会严格校验IEnumerable元素的顺序——它的行为和Assert.That(..., Is.EqualTo(...))一致,会按序列逐个比对元素,无法直接实现Is.EquivalentTo(...)那种忽略顺序的断言效果。
要实现忽略顺序的校验,常用两种方案:
方案1:手动在测试方法内使用EquivalentTo断言
放弃依赖Returns()的自动断言逻辑,把预期值作为测试用例的参数传递,在测试方法内部拿到结果后,用Assert.That结合Is.EquivalentTo做校验。示例代码:
[Test] [TestCaseSource(nameof(MyTestCases))] public void CalculateValuesTest(int input, IEnumerable<int> expected) { IEnumerable<int> result = MyCalculationMethod(input); // 用EquivalentTo忽略顺序校验 Assert.That(result, Is.EquivalentTo(expected)); } private static IEnumerable<TestCaseData> MyTestCases() { // 预期值和输入参数一起传入,不用Returns() yield return new TestCaseData(5, new[] {3, 1, 2}) .SetName("Input5_ReturnsUnorderedValues"); }
方案2:转换为无序集合(有局限性)
如果你的集合元素无重复且支持哈希,可以把预期值转换成HashSet<T>后传给Returns(),因为HashSet<T>的相等校验会忽略顺序。但注意:如果原集合包含重复元素,HashSet<T>会自动去重,导致断言错误,所以只适合无重复元素的场景。示例:
[Test] [TestCaseSource(nameof(NoDuplicateTestCases))] public IEnumerable<int> GetUniqueValuesTest(int input) { return MyUniqueValueMethod(input); } private static IEnumerable<TestCaseData> NoDuplicateTestCases() { // 用HashSet作为返回预期值,忽略顺序 yield return new TestCaseData(3) .Returns(new HashSet<int> {2, 1}) .SetName("Input3_ReturnsUniqueUnorderedValues"); }
总体来说,方案1是通用且可靠的选择,能覆盖所有包含或不包含重复元素的IEnumerable场景;方案2仅适用于无重复元素的特定情况。
内容的提问来源于stack exchange,提问作者Kacper Wyczawski
相关产品推荐
相关产品推荐

