我试图断言在 stub 上调用了一个方法。我试图断言的方法被调用了一个 IEnumerable<string>
.我不关心具体的内容,只是想测试一下count是不是某个数字。我无法得到正确的断言,我明白了
Rhino.Mocks.Exceptions.ExpectationViolationException : Bob.DoThings(collection count equal to 10); Expected #1, Actual #0.
我知道 DoThings() 确实被调用了......我只是无法获得正确的约束..
var myBob= MockRepository.GenerateStub<Bob>();
var countConstraint = Rhino.Mocks.Constraints.List.Count(Rhino.Mocks.Constraints.Is.Equal(10));
// execution code....
Joe myJoe = new Joe(myBob);
myJoe.MethodThatShouldCallDoThingWith10();
myBob.AssertWasCalled(s => s.DoThings(null), o => Constraints(countConstraint));
我还尝试添加“IgnoreArguments”作为约束。我错过了什么?
最佳答案
这里的问题是延迟执行。直到IEnumerable<string>
枚举项目列表是“构建的”。由于 Rhino.Mocks 只记录被调用的内容,它从不“使用”方法参数,因此从不构建或枚举列表。如您所见,添加 ToList() 或 ToArray() 可枚举并构建列表,因此如果您使用其中一种方法,测试将通过。
一种解决方法是获取传递给该方法的列表并对其进行检查:
var list = (IEnumerable<int>) myBob.GetArgumentsForCallsMadeOn(b => b.DoThings(null))[0][0];
Assert.AreEqual(10, list.Count());
此测试通过并且不需要对您的代码进行任何更改。
关于c# - Rhino 模拟列表约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7519607/