Eri*_*fer 5 .net c# collections nunit constraints
我有一个实现的类ICollection<SomeConcreteClass>.NUnit集合约束不会将其识别为集合.
例如Assert.That( sut, Has.No.Member( someObjectOfTypeSomeConcreteClass ) );投掷System.ArgumentException : The actual value must be a collection
并Assert.That( sut, Is.Empty );失败了sut.
那么什么时候集合是一个集合(根据NUnit)?
堆栈跟踪:
System.ArgumentException : The actual value must be a collection Parametername: actual
at NUnit.Framework.Constraints.CollectionConstraint.Matches(Object actual)
at NUnit.Framework.Constraints.NotConstraint.Matches(Object actual)
MyTestFile.cs(36,0): at MyAssembly.MyTestFixture.MyTestMethod()
Run Code Online (Sandbox Code Playgroud)
NUnit 2.4.3.0出现上述问题.我刚用2.6尝试过.Is.Empty现在有效,但Has.No.Member仍然失败.它甚至没有打电话Equals()或operator ==().它如何比较收集元素?RhinoMocks Arg<MyCollection>.List.Count( Is.Equal( 1 ) )现在也失败了.
结论:
对于NUnit 2.4,集合约束要求将集合的非泛型ICollection实现为集合(可回答原始问题).IEnumerable相等按预期工作.
使用NUnit 2.6(可能还有3.0),IEnumerable即使Equals被覆盖,匹配元素也会检查s的相等性.这就是为什么如果元素IEnumerable本身就是成员约束不起作用的原因.这是一个已知问题(https://bugs.launchpad.net/nunit-3.0/+bug/646786).
详情请参阅我自己的答案.
我想我明白了。
NUnit 2.4.3.0 尝试转换为ICollection我没有实现的非泛型。现在适用于 2.4。
在 NUnit 2.6.0.12051 中有一个NUnitEqualityComparer可以执行此操作:
if (x is IEnumerable && y is IEnumerable && !(x is string && y is string))
return EnumerablesEqual((IEnumerable)x, (IEnumerable)y, ref tolerance);
Run Code Online (Sandbox Code Playgroud)
我的集合成员是 IEnumerable,在测试的情况下都是空的。这就是为什么约束认为所有实例都是平等的。但他们不是。NUnitEqualityComparer 假定类具有成员 (IEnumerable) 或具有自己的状态。我的集合成员类(在问题中称为 SomeConcreteClass)既是可枚举的,又具有其他状态,例如 Name 属性。由于 NUnitEqualityComparer 的工作方式,不会比较附加状态,并且具有不同附加状态的空对象被错误地认为是相等的。
我将与 NUnit 邮件列表讨论此问题,并在此处进行报告。
编辑:
这是已知的行为:https://bugs.launchpad.net/nunit-3.0/+bug/646786
| 归档时间: |
|
| 查看次数: |
1033 次 |
| 最近记录: |