0

現時点では次のように動作するクラスがあります。

public class MyClass {

    public void Method1(){
        if (false) {
            Method2();
        }
    }

    public void Method2(){
        //do something here
    }
}

そのため、Method2 が呼び出されることはありません (私のコードは少し異なって見えますが、この if 句が false と評価されるため、Method2 を実行しません。デバッグで確認しました)。Method2 が呼び出され、テストが失敗することを期待していることを RhinoMocks に伝えたいと思います。

MockRepository mock = new MockRepository();
MyClass presenter = mock.PartialMock<MyClass>();

Expect.Call(() => presenter.Method2()).IgnoreArguments();

mock.ReplayAll();
presenter.Method1();
mock.VerifyAll();

...しかし、テストはパスします。

(Expect.Call のラムダ式の理由は、実際の Method2 に引数があるためです)

私の質問:

  • これは、このシナリオでテストするための通常のアプローチですか? (私はRhinoMocksとモックフレームワーク全般から始めたばかりです)
  • なぜテストに合格するのですか?
4

2 に答える 2

3

Jakobのコメントで確認されてPartialMockいるように、抽象/仮想メソッドのみをモックするため、期待は実際には何もしていません。

個人的には、私がテストしているクラス内のメソッドをモックアウトすることは通常ありません。依存関係をモックアウトし、具象クラスの代わりにインターフェイスを介して依存関係を表現し、最初からこの問題を回避しています。

于 2009-03-13T10:06:41.987 に答える
0

具象クラスを部分的にモックアウトすることには多くの価値があると思います。たとえば、クラス内で呼び出されるプライベート メソッドがいくつかあるとします。テストする前にそれらを「内部」にする必要があることは明らかですが、新しいクラスを作成せずにこれをテストする方法が必要です (多くの場合、これは適切なソリューションではありません)。

このテストを失敗させるには、方法 2 の署名が必要です。

public virtual void Method2(){}

于 2009-03-13T13:41:34.310 に答える