あなたが言ったように、テストで発生している摩擦は、ドメイン モデルの設計上の問題の兆候である可能性が最も高いです。理想的には、テストを聞いて、問題を根本から解決する必要があります。ただし、この場合は実現不可能であるため、回避策を示します。
メソッドを使用して、固定された順序Fixture
から常にオブジェクトを返すように を設定できます。LineItem
Register<T>(Func<T> creator)
カスタマイズでパッケージ化された例を次に示します。
public class GenerateLineItemFromFixedSequence : ICustomization
{
public void Customize(IFixture fixture)
{
var items = CreateFixedLineItemSequence(fixture);
fixture.Register(() => GetRandomElementInSequence(items));
}
private static IEnumerable<LineItem> CreateFixedLineItemSequence(IFixture fixture)
{
return fixture.CreateAnonymous<LineItem[]>();
}
private static LineItem GetRandomElementInSequence(IEnumerable<LineItem> items)
{
var randomIndex = new Random().Next(0, items.Count());
return items.ElementAt(randomIndex);
}
}
テストのコンテキストでこの動作を適用するには、Fixture
オブジェクトにカスタマイズを追加するだけです:
fixture.Customize(new GenerateLineItemFromFixedSequence());
LineItem
同様に、前述の部分的に出荷された注文のように、さまざまな状態のオブジェクトの固定シーケンスを生成する他のカスタマイズを作成し、それらをさまざまなテストで使用できます。
観察
アルゴリズム自体は作成されるオブジェクトのタイプと結合されていないため、このカスタマイズを汎用にすることができることに注意してください。これにより、効果的に戦略に変換されます。
したがって、汎用パラメーターを導入してカスタマイズを変更します。
public class GenerateFromFixedSequence<T> : ICustomization
{
public void Customize(IFixture fixture)
{
var items = CreateFixedSequence(fixture);
fixture.Register(() => GetRandomElementInSequence(items));
}
private static IEnumerable<T> CreateFixedSequence(IFixture fixture)
{
return fixture.CreateAnonymous<T[]>();
}
private static T GetRandomElementInSequence(IEnumerable<T> items)
{
var randomIndex = new Random().Next(0, items.Count());
return items.ElementAt(randomIndex);
}
}
さまざまなオブジェクトに使用できます。
fixture.Customize(new GenerateFromFixedSequence<LineItem>());
fixture.Customize(new GenerateFromFixedSequence<Order>());
fixture.Customize(new GenerateFromFixedSequence<Shipment>());