使用Rhino Mocks,为什么在测试初始化​​期间调用属性上的模拟会返回预期的调用#1,实际调用#0?

时间:2009-04-07 19:49:08

标签: rhino-mocks rhino

我目前有一个测试,测试我在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();
});
        }

3 个答案:

答案 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)

  1. 你究竟想在Test方法中测试什么?
  2. 你应该尽量避免使用严格的模拟。
  3. 我建议使用Rhino's AAA syntax (Arrange, Act, Assert)

答案 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;
    }