1

コンストラクターと Build メソッドを何度も実装するのに飽きたので、単体テスト用の汎用データビルダーを作成しました。これはパターンの美しさを覆い隠しますか (私が本当に愛している)?

これが私の一般的なビルダーです(Moqを使用してC#で構築されています):

public class GenericMockBuilder<T> where T: class
{
    private readonly Mock<T> _objectMock = new Mock<T>(); 

    protected Mock<T> ObjectMock
    {
        get { return _objectMock; }
    }

    public T Build()
    {
        return _objectMock.Object; 
    }
}

そして、ここにインターフェイスの例と、一般的なものを継承する具体的なビルダーを示します。

public interface IFoo
{
    int Bar();
}

public class FooBuilder: GenericMockBuilder<IFoo>
{
    public FooBuilder WithBar(int barValue)
    {
        base.ObjectMock.Setup(x => x.Bar()).Returns(barValue);
        return this;
    }

}

ビルダーは、次のような foo モックを作成します。

        IFoo fooMock = new FooBuilder().WithBar(12).Build();

改善のための意見や提案を聞きたいです。

EDIT(イベント発生の例を追加):

public class FooBuilderWithEvent: GenericMockBuilder<IFoo>
{

    public FooBuilderWithEvent RaiseEvent(FooEventArgs fooEventArgs)
    {
        base.ObjectMock.Raise(m => m.FooEvent += null, fooEventArgs); 
        return this; 
    }

}

モックの構築とイベントの発生は次のようになります。

        FooBuilderWithEvent fooBuilderWithEvent = new FooBuilderWithEvent(); 
        IFoo fooMock = fooBuilderWithEvent.Build();

        //Create testobject and prepare for event here

        fooBuilderWithEvent.RaiseEvent(new FooEventArgs()); 
4

2 に答える 2

1

長所

  • 素敵なドメイン固有の流暢なインターフェース

短所

  • 誰も慣れていない別のインターフェイス(私と他の多くの開発者は、Moqの標準的な流暢なインターフェイスを使用したモックセットアップで複雑なことは何も見ていないと思います)
  • モック化されたインターフェースごとにビルダー クラスを作成する (はい、複雑なモックに対してのみビルダーを作成できますが、2 つの異なるモック化インターフェースを使用すると、開発者が混乱する可能性があります)
  • モックメンバーごとにセットアップメソッドを作成する

ビルダー内にこのすべてのコードが既にあるため、Moq サンプルを求めている理由がわかりません。

var mock = new Mock<IFoo>();
mock.Setup(foo => foo.Bar()).Returns(42);

ラムダとmock.Object呼び出しがわかりにくい場合は、RhinoMocks を試してください。

Exect.Call(foo.Bar()).Return(42);

また、質問があります。モックされたオブジェクト インスタンスのみを使用してイベントを発生させるにはどうすればよいですか?

于 2012-10-30T12:44:57.123 に答える
0

モックフレームワーク上にファサードを構築する必要があるということは、それがあなたに適していないことを示しています。別のものを試してみませんか。私は個人的にMoqからNSubstituteに切り替えました:

あなた自身の例:

IFoo fooMock = Substitute.For<IFoo>();
fooMock.WithBar(12).Returns(10);

または、メソッドが呼び出されていることだけを確認したい場合:

//arrange
IFoo fooMock = Substitute.For<IFoo>(); 

//act
fooMock.WithBar(12);

//assert
fooMock.Received().WithBar(12);
于 2012-10-30T16:06:24.910 に答える