2

我有一个快速的问题,我无法在有关 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()

但这将使我能够通过任何争论;所以如果 Save 界面发生变化,后来需要 5 个参数,我的测试仍然会通过。

我怎样才能确保它只需要 2 个参数,以及它们的正确类型?

也许更重要的是——写这样的单元测试太脆弱了吗?也许我应该对其进行编码以期望任何参数,以便每次我重构时都不必回来更改该行?我发现我使用大量模拟的测试用例非常脆弱,每当我重构时,我都必须更改它们......也许我在这里误用了模拟?对这些东西还是很陌生,所以非常感谢任何建议。

4

2 回答 2

5

使用Is.TypeOf()匹配器匹配特定类型而不考虑其值。你想要这样的东西:

Expect.Once.On(dao).Method("Save").With(Is.TypeOf(typeof(string)));

至于它是否合理,如果您试图验证一个方法是否可以处理其指定输入类型的参数,我会说这在一般情况下是可以的。例如,假设您将 a 传递给Car需要 a 的方法Vehicle;确保该方法可以正确处理派生类型将很有用。

于 2009-12-14T15:34:00.627 回答
2

您可以创建一个简单的类:

class DontCare
{
    public override bool Equals(object obj)
    {
        return true;
    }
}

Expect.Once.On(dao).Method("Save").With(new DontCare());
于 2011-07-11T13:26:30.080 回答