2

テストしたい 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()がステップオーバーされ、ステップインできません。

理由はありますか?

4

2 に答える 2

5

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

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();
}
于 2009-04-30T09:36:23.713 に答える
0

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

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

RhinoMocksExtensions.Replay (foo);

電話する前に

Assert.IsTrue (foo.Method2 ());

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

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

于 2009-04-30T09:44:02.777 に答える