web-dev-qa-db-ja.com

Moqで具体的なオブジェクトの関数呼び出しをモックする方法は?

Moqでこれを行うにはどうすればよいですか?

_Foo bar = new Foo();
Fake(bar.PrivateGetter).Return('whatever value')
_

フレームワークを介して作成されたオブジェクトをモックする方法しか見つけられないようです。作成した具象オブジェクトの単一のメソッド/プロパティをモックしたい。

TypeMockでは、Isolate.WhenCalled(bar.PrivateGetter).Returns('whatever value')を実行します。

何か案は?

32
dferraro

TypeMock Isolator(およびおそらくモール)だけがこれらのスタントを実行できます。通常の動的モックライブラリは 仮想および抽象メンバーのみをモックする ができます。

13
Mark Seemann

Mockオブジェクトを作成するにはMoqを使用し、オブジェクトの動作を使用するにはCallBaseプロパティをtrueに設定する必要があります。

Moqドキュメントから:CallBaseは、「メンバーをオーバーライドする期待がなければ、基本クラスの実装を呼び出す」と定義されています。これは「部分モック」と呼ばれます。すべてをモックする必要なしに、クラスの特定の部分をモックすることができます。

サンプルコード:

    [Test]
    public void FailintgTest()
    {
        var mock = new Moq.Mock<MyClass>();
        mock.Setup(m => m.Number).Returns(4);
        var testObject = mock.Object;
        Assert.That(testObject.Number, Is.EqualTo(4));
        Assert.That(testObject.Name, Is.EqualTo("MyClass"));
    }

    [Test]
    public void OKTest()
    {
        var mock = new Moq.Mock<MyClass>();
        mock.Setup(m => m.Number).Returns(4);
        mock.CallBase = true;
        var testObject = mock.Object;
        Assert.That(testObject.Number, Is.EqualTo(4));
        Assert.That(testObject.Name, Is.EqualTo("MyClass"));
    }

    public class MyClass
    {
        public virtual string Name { get { return "MyClass"; } }

        public virtual int Number { get { return 2; } }
    }
53
Ariel Popovsky

署名の型が可視である限り、モールはプライベートメソッドを置き換えることもできます。したがって、この場合は次のようになります。

MFoo bar = new MFoo { // instantiate the mole of 'Foo'
    PrivateGetterGet = () => "whatever value" // replace PrivateGetter {get;}
};
Foo realBar = bar; // retrive the runtime instance
...

Molesの詳細については、チュートリアル http://research.Microsoft.com/en-us/projects/pex/documentation.aspx から始めてください。

3
Peli