关于Rhino Mock(RhinoAutoMocker)的问题

时间:2010-08-10 11:04:31

标签: rhino-mocks

我对Rhino Mock有疑问。

我试图限制可以从正在测试的方法中调用哪些方法。

让我们说我有一种方法,我正在写这样的单元测试:

public void MyMethod()
{
   var test = _Repository.Get(2);

   _Services.DoSomething(test);
}

我现在做的是这样的事情:

[Test]
public void TestMethod()
{
   var mock1 = CreateMock<IRepository>();
   var mock2 = CreateMock<IServices)();

    mock1.Expect(x => x.Get(1).IgnoreArguments().Return(new Poo()).Repeat.Once();
    mock2.Expect(x => x.DoSomething(new Something()).IgnoreArguments().Repeat.Once();

    ClassUnderTest.MyMethod();

    mock1.VerifyAllExpectations();
    mock2.VerityAllExpectations();
}

这很好,但我想要的是阻止某人改变这样的方法:

public void MyMethod()
{
   var test = _Repository.Get(2);

   var test = _Repository.Save(test);

   _Services.DoSomething(test);
}

正如你所看到的那样调用Repository上的Save方法,所以这显然很危险,因为如果有人错误地在那里添加那行,我们将遇到麻烦。

我怎样才能限制某些人这样做?感谢。

1 个答案:

答案 0 :(得分:2)

有几个选择:

严格模拟

如果以与期望不匹配的方式调用它们,则严格模拟会抛出异常。你可以像这样创建严格的模拟:

var mocks = new MockRepository();
var fooStrictMock = mocks.StrictMock<IFoo>();

<强> .Repeat.Never()

如果您只想阻止对一种特定方法的调用,可以使用.Repeat.Never()量词来表达这样的期望:

mock1.Expect(x => x.Save(null)).IgnoreArguments().Repeat.Never();

<强> AssertWasNotCalled

您可以在测试结束时拨打AssertWasNotCalled,如下所示:

var repositoryStub = MockRepository.GenerateStub<IRepository>();
repositoryStub.Stub(x => x.Get(2)).Return(...);

var underTest = new UnderTest(repositoryStub);
underTest.DoSomething();

repositoryStub.AssertWasNotCalled(x => x.Save(Arg<Thing>.Is.Anything));