1

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

3 回答 3

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

于 2009-06-05T13:17:19.250 回答
0
  1. 您到底想在 Test 方法中测试什么?
  2. 您应该尽量避免使用严格的模拟。
  3. 我建议使用Rhino 的 AAA 语法 (Arrange, Act, Assert)
于 2009-04-07T19:58:10.677 回答
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;
    }
于 2009-04-07T20:35:05.207 回答