Sample
他の2つのオブジェクトを指定してオブジェクトを作成する責任を持つクラスをテストするためのさまざまなオプションについて、いくつかの洞察を得たいと思います。
私のオブジェクトの API は次のとおりです。
public interface ISampleCreator
{
Sample CreateSample(Order order, SampleService sampleService);
}
このメソッドのロジックは、次の 3 つの部分に分けることができます。
のいくつかの単純なプロパティを初期化します(および
Sample
によって異なります)。Order
SampleService
の新しい一意の名前を設定します(および
Sample
によって異なります)。Order.Samples
SampleService
にいくつかの追加フィールドを設定します
Sample
( によって異なりますSampleService
)。
私の問題は、メソッドを徹底的にテストしたい場合、いくつかの複雑なセットアップを考慮に入れる必要があるさまざまなケースがあることです。
私の最初のアイデアは、クラスを抽出してポイント 2 の一意の名前を生成し、クラスを抽出してサンプルの追加フィールドを生成することです。
次に、これら 2 つのクラスを個別にテストし、それらをモックして、CreateSample
メソッドのテストを減らすことができます。例えば:
[TestMethod]
public void CreateSampleTest()
{
Order order = new Order();
SampleService sampleService = new SampleService();
Mock<ISampleNameGenerator> mockNameGenerator = new Mock<ISampleNameGenerator>();
mockNameGenerator.Setup(x => x.GenerateSampleName(order.Samples, sampleService))
.Returns("Generated name");
Mock<ISampleFieldsCreator> mockFieldsCreator = new Mock<ISampleFieldsCreator>();
List<SampleField> sampleFields = new List<SampleField>();
mockFieldsCreator.Setup(x => x.CreateFieldsForNewSample(sampleService))
.Returns(sampleFields);
SampleCreator sampleCreator = new SampleCreator(mockNameGenerator.Object, mockFieldsCreator.Object);
Sample sample = sampleCreator.CreateSample(order, sampleService);
Assert.AreEqual("Generated name", sample.Name);
Assert.AreEqual(sampleFields, sample.Fields);
Assert.AreEqual(order, sample.Order);
Assert.AreEqual(sampleService, sample.SampleService);
}
このアプローチで私が抱えている問題は、私が所有していて外部リソースにアクセスしないクラスをモックしていることです。基本的に、テストのセットアップを簡素化する方法として、モックベースのテストを行っています。
このアプローチについてどう思いますか?
他の代替案を提案できますか?なぜそうするのですか?