我有一个简短的问题,我在关于NMock2.0的文档中无法弄清楚。
我有一个名为Save()的函数,我想模拟出来。这将字符串ID作为参数,小数作为值..
我知道我可以写这个来确保使用2个特定值调用Save():
Expect.Once.On(dao) _
.Method("Save").With(New Object() {"foo", 1})
但是只有在传递“foo”和1时才会通过。我确实控制了值“foo”,但对于第二个值,我不知道它会是什么;或者我不关心至少在这个特定的测试中测试它的价值。
我知道我可以写:
Expect.Once.On(dao) _
.Method("Save").WithAnyArguments()
但这将允许我通过任何辩论;因此,如果保存界面更改,稍后需要5个参数,我的测试仍然会通过。
我怎样才能确保它只需要2个参数及其正确的类型?
也许更重要的是 - 写这样的单元测试太脆了?也许我应该编码它以期待任何参数,所以每次重构我都不必回来改变那条线?我发现我使用大量模拟的测试用例非常脆弱,无论何时我重构我都要改变它们......也许我在这里使用模拟错误?对于这些东西还是很新的,所以非常感谢任何建议。
答案 0 :(得分:5)
使用Is.TypeOf()
匹配器匹配特定类型而不考虑其值。你想要这样的东西:
Expect.Once.On(dao).Method("Save").With(Is.TypeOf(typeof(string)));
至于它是否合理,如果你试图验证方法可以处理其指定输入类型的参数,我会说在一般情况下这很好。例如,假设您将Car
传递给期望Vehicle
的方法;确保该方法可以正确处理派生类型将非常有用。
答案 1 :(得分:2)
您可以创建一个简单的类:
class DontCare
{
public override bool Equals(object obj)
{
return true;
}
}
Expect.Once.On(dao).Method("Save").With(new DontCare());