NMock - 怎么说对这些参数有什么期望'任何价值'?或者我不应该这样做?

时间:2009-12-14 15:20:19

标签: unit-testing nmock nmock2

我有一个简短的问题,我在关于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个参数及其正确的类型?

也许更重要的是 - 写这样的单元测试太脆了?也许我应该编码它以期待任何参数,所以每次重构我都不必回来改变那条线?我发现我使用大量模拟的测试用例非常脆弱,无论何时我重构我都要改变它们......也许我在这里使用模拟错误?对于这些东西还是很新的,所以非常感谢任何建议。

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());