1

現在、MVPモデルにあるプレゼンターをテストするテストがあります。プレゼンターには、ビューを呼び出すプロパティがあります。これは、テストではモックアウトされています。テストの初期化では、プレゼンターのビューをモックビューに設定した後、このメソッドを呼び出すプレゼンターのプロパティを設定しました。

私のテストでは、呼び出すメソッドの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

なぜ、テストが実行されるたびに同じことをテストしたいのでしょうか?

特定のことが起こることをテストしたい場合は、1 回のテストでそれを確認する必要があります。

現在使用しているパターンは、テストの前提条件を設定する必要があることを意味します - 動作を実行する - 動作が正しいことを確認し、1 つのテストでそれを数回繰り返します

テストごとに 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

問題は、厳密なモックで行われている記録/検証を理解していないことにありました。私が抱えていた問題を解決するために、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 に答える