我对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方法,所以这显然很危险,因为如果有人错误地在那里添加那行,我们将遇到麻烦。
我怎样才能限制某些人这样做?感谢。
答案 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));