web-dev-qa-db-ja.com

C#/ .NETで引数のないコンストラクターなしでオブジェクトをモックする

引数のないコンストラクタを提供せず、コンストラクタに引数を渡さないクラスからモックを作成することは可能ですか?多分ILを動的に作成すると?

背景は、テストのためだけにインターフェースを定義したくないということです。回避策は、テスト用に引数のないコンストラクターを提供することです。

36
deamon

確実なこと。この例では、本当に素晴らしいモックライブラリーであるMoqを使用します。

例:

public class MyObject
{
     public MyObject(object A, object B, object C)
     {
          // Assign your dependencies to whatever
     }
}

Mock<MyObject> mockObject = new Mock<MyObject>();
Mock<MyObject> mockObject = new Mock<MyObject>(null, null, null); // Pass Nulls to specific constructor arguments, or 0 if int, etc

ただし、多くの場合、依存関係をテストできるように、引数としてMockオブジェクトを割り当てます。

Mock<Something> x = new Mock<Something>();
MyObject mockObject = new MyObject(x.Object);

x.Setup(d => d.DoSomething()).Returns(new SomethingElse());

etc
51
Tejs

テスト用のインターフェースのみを提供していると考えるのは間違いです。インターフェイスは、抽象化を提供し、コードの異なるレイヤー間の結合を弱め、異なるコンテキストで再利用しやすくするためにあります。

これは、答えは使用しているモックフレームワークに依存すると言われています。たとえば、Rhino Mocksを使用すると、次のことができます。

public class Foo
{
    public Foo(string bar)
    { }

    public virtual int SomeMethod()
    {
        return 5;
    }
}

その後:

var fooMock = MockRepository.GeneratePartialMock<Foo>("abc");
fooMock.Expect(x => x.SomeMethod()).Return(10);
1
Darin Dimitrov