2

Sample他の2つのオブジェクトを指定してオブジェクトを作成する責任を持つクラスをテストするためのさまざまなオプションについて、いくつかの洞察を得たいと思います。

私のオブジェクトの API は次のとおりです。

public interface ISampleCreator
{
    Sample CreateSample(Order order, SampleService sampleService);
}

このメソッドのロジックは、次の 3 つの部分に分けることができます。

  1. のいくつかの単純なプロパティを初期化します(およびSampleによって異なります)。OrderSampleService

  2. の新しい一意の名前を設定します(およびSampleによって異なります)。Order.SamplesSampleService

  3. にいくつかの追加フィールドを設定します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);
    }

このアプローチで私が抱えている問題は、私が所有していて外部リソースにアクセスしないクラスをモックしていることです。基本的に、テストのセットアップを簡素化する方法として、モックベースのテストを行っています。

このアプローチについてどう思いますか?

他の代替案を提案できますか?なぜそうするのですか?

4

2 に答える 2