コンストラクターと 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());