【问题标题】:Using Rhino Mocks, why does invoking a mocked on a property during test initialization return Expected call #1, Actual call #0?使用 Rhino Mocks,为什么在测试初始化​​期间对属性调用模拟返回预期调用 #1,实际调用 #0?
【发布时间】:2009-04-07 19:49:07
【问题描述】:

我目前有一个测试,用于测试我在 MVP 模型中的演示者。在我的演示者上,我有一个属性将调用我的视图,在我的测试中它被模拟了。在我的测试的初始化中,在我将 Presenter 上的 View 设置为模拟 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();
});
        }

【问题讨论】:

    标签: rhino-mocks rhino


    【解决方案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

    【讨论】:

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

      【讨论】:

        【解决方案3】:

        问题在于我不了解 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;
            }
        

        【讨论】:

        • 再一次,你确定你需要严格的模拟吗?您的场景看起来更像是使用普通模拟,它不会强制您指定所有期望。而且如果你使用 AAA,编码就简单多了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-11
        • 1970-01-01
        • 1970-01-01
        • 2012-02-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多