期待が設定されていなくても、部分モックの仮想メソッドがすべてモックされるのはなぜですか?

StackOverflow https://stackoverflow.com/questions/806073

質問

ValidateChildrenメソッドでテストしたい検証を行うユーザーコントロールがあります。ユーザーコントロールの部分的なモックを作成しましたが、ValidateChildrenメソッドに期待値を設定していませんが、単に呼び出しているだけで、単にスキップされ、メソッド内のコードは実行されません。何が起こっているのかを理解するために、次のような簡単なテストを作成しました。

public class Foo
{        
    public virtual bool Method1()
    {
        throw new NotImplementedException();
    }

    public virtual bool Method2()
    {
        return Method1();
    }
}

そしてこれを使ってテストします:

[Test]
public void TestFooMethods ()
{
    MockRepository m = new MockRepository();
    Foo foo = m.PartialMock<Foo>();

    RhinoMocksExtensions.Expect<Foo,bool>(
                             foo, 
                             delegate (Foo obj)
                             {
                                 return obj.Method1();
                             }
                         ).Return(true);

    Assert.IsTrue (foo.Method2());
}

今、foo.Method1がモックされ、foo.Method2がモックされないと予想します。ただし、これは常にfalseを返します。デバッガーでステップスルーしようとすると、foo.Method2()がステップオーバーされ、ステップインできません。

理由は何ですか?

役に立ちましたか?

解決 2

OK、もう少し遊んだ後(おそらく問題を書き留めておくだけで、それについてより明確に考えることができました)、解決策を見つけたと思います。

電話する必要があるようです:

RhinoMocksExtensions.Replay (foo);

電話する前に

Assert.IsTrue (foo.Method2 ());

仮想メソッドが使用されており、期待値を設定していない場合は、おそらくRhinoモックに明示的に通知する必要があります。理由はわかりません。誰かがこの背後にある理由を知っているなら、私は知りたいです。

とにかくすべてがうまくいっているようで、とても幸せな日々です。

他のヒント

オブジェクトをモックすると、モックのタイプに関係なく、すべての抽象メソッド/仮想メソッドがオーバーライドされます。ただし、できることは、メソッドに期待をかけ、オーバーライドする元のメソッドを実行するように指示することです。

CallOriginalMethod(OriginalCallOptions.CreateExpectation);

Rhino Mocksを設計どおりに使用していないため、トラブルが発生している可能性があります。 C#3.0とラムダおよび拡張メソッドを使用して、テストを記述する方法でテストを書き直しました。

[TestMethod]
public void TestFooMethods()
{
    //Generate a new Mock to test against
    Foo foo = MockRepository.GenerateMock<Foo>();

    //Expect a call to Method1 on object foo and return true
    foo.Expect(f => f.Method1()).Return(true);
    //Expect a call to Method2 on object foo and call the original method
    foo.Expect(f => f.Method2()).CallOriginalMethod(OriginalCallOptions.CreateExpectation);

    Assert.IsTrue(foo.Method2());

    //Verify all our expectations on foo
    foo.VerifyAllExpectations();
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top