c# - Rhino 模拟列表约束

标签 c# unit-testing list rhino-mocks

我试图断言在 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/

相关文章:

c# - 无法解析数据类型 XAML C#

c# - 在 C# 中使用 MySQL ANTLR4 语法,无法找到 "The type or namespace name ' MySQLBaseLexer'

c# - 如何使用 Moq 创建回声模拟?

c# - 在单元测试中单步执行和调试代码

python - 返回产生最大差异的值的索引

list - lisp "list"函数/关键字有什么作用?

python - 如何在python中更新全局变量

c# Microsoft.Office.Interop.Word.Document 到流

c# - 使用 .net framework 4.0 在 sql server 2008 中创建的 dll 创建 CLR 存储过程。显示错误

python - 无法在单元测试中授权