我目前有一个测试,测试我在MVP模型中的演示者。在我的主持人身上,我有一个属性,可以调用我的视图,在我的测试中被嘲笑。在我的测试的初始化中,在我将Presenter上的View设置为模拟视图后,我在Presenter上设置我的属性,该属性将调用此方法。
在我的测试中,我没有为我调用的方法设置Expect.Call,但是当我运行时,我得到了这个Rhino模拟异常:
Rhino.Mocks.Exceptions.ExpectationViolationException:IView.MethodToInvoke();预计#1,实际#0 ..
根据我对Rhino模拟的理解,只要我在预期的块外面调用模拟它就不应该记录这个。我想象测试通过。有没有理由不通过?
下面是一些显示我的设置的代码。
public class Presenter
{
public IView View;
public Presenter(IView view)
{
View = view
}
private int _property;
public int Property
get { return _property;}
set
{
_property = value;
View.MethodToInvoke();
}
}
...下面的测试代码......
[TestInitialize]
public void Initilize()
{
_mocks = new MockRepository();
_view = _mocks.StrictMock<IView>();
_presenter = new Presenter(_view);
_presenter.Property = 1;
}
[TestMethod]
public void Test()
{
Rhino.Mocks.With.Mocks(_mocks).Expecting(delegate
{
}).Verify(delegate
{
_presenter.SomeOtherMethod();
});
}
答案 0 :(得分:1)
为什么在每次测试运行时你想要测试同样的东西?
如果您想测试特定的事情发生,您应该在一次测试中检查。
您现在使用的模式意味着您需要 - 设置测试的先决条件 - 做行为 - 检查行为是否正确 然后在一次测试中重复几次
您需要为每个测试开始测试一件事,这有助于使测试更清晰,并且更容易使用AAA语法。
这里有几件事需要讨论,但如果你这样做的话肯定会更清楚:
[TestMethod]
ShouldCallInvokedMethodWhenSettingProperty()
{
var viewMock = MockRepository.GenerateMock<IView>()
var presenter = new Presenter(viewMock);
presenter.Property = 1;
viewMock.AssertWasCalled(view => view.InvokedMethod());
}
在此处阅读有关Rhino Mocks 3.5语法的更多信息:http://ayende.com/Wiki/Rhino+Mocks+3.5.ashx
答案 1 :(得分:0)
答案 2 :(得分:0)
问题在于我不理解Strict模拟正在进行的记录/验证。为了解决这个问题我正在改变我的TestInitilize函数。这基本上是对我正在为我的所有测试设置的初始状态进行快速测试。
[TestInitialize]
public void Initilize()
{
_mocks = new MockRepository();
_view = _mocks.StrictMock<IView>();
_presenter = new Presenter(_view);
Expect.Call(delegate { _presenter.View.InvokedMethod(); });
_mocks.ReplayAll();
_mocks.VerifyAll();
_mocks.BackToRecordAll();
_presenter.Property = 1;
}