期待が設定されていなくても、部分モックの仮想メソッドがすべてモックされるのはなぜですか?
-
03-07-2019 - |
質問
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();
}