Autofixture によって生成された古い文字列 (Guid-y のような値) では満足できない文字列コンストラクター パラメーターがクラスにあるというシナリオを克服しようとしています。
Mark Seemann の Ploeh ブログ エントリ on Convention-based Customizations へのリンクで簡単に答えたくなる前に、私はこのテストのためにそれと彼の他のブログ エントリを参照していると言っておきましょう。合格。
デバッグをステップ実行すると、ある時点でコンストラクター パラメーターが有効な値で渡されていることがわかりますが、テストは Guid-y Color 値で失敗します。これは、「色」パラメーター値と、Autofixture によって入力される「色」プロパティの両方があるという事実と関係があると思います。コンストラクター パラメーターに対処する ISpecimenBuilder を作成しましたが、パブリック プロパティの値をテストしているのでしょうか (2 つの異なること)?
この例ではこれがやり過ぎであることはわかっていますが、Build<T>().With()
メソッドの使用が DRY ではない、より複雑なシナリオを想定しています。
失敗したテスト
[Fact]
public void Leaf_Color_Is_Brown()
{
// arrange
var fixture = new Fixture().Customize(new LeafColorCustomization());
// act
var leaf = fixture.Create<Leaf>();
// using .Build<>.With(), test passes
//var leaf = fixture.Build<Leaf>().With(l => l.Color, "brown").CreateAnonymous();
// assert
Assert.True(leaf.Color == "brown");
}
SUT
public class Leaf
{
public Leaf(string color)
{
if (color != "brown")
throw new ArgumentException(@"NO LEAF FOR YOU!");
this.Color = color;
}
public string Color { get; set; }
}
CompositeCustomization の実装(この例では AutoMoqCustomization() は必要ないことはわかっています)
public class LeafCustomization : CompositeCustomization
{
public LeafCustomization()
: base(
new LeafColorCustomization(),
new AutoMoqCustomization()) { }
}
リーフ固有の ICustomization
public class LeafColorCustomization : ICustomization
{
public void Customize(IFixture fixture)
{
if (fixture == null)
throw new ArgumentNullException("fixture");
fixture.Customizations.Add(new LeafBuilder());
}
}
色固有の ISpecimenBuilder を持つ文字列コンストラクター
public class LeafBuilder : ISpecimenBuilder
{
public object Create(object request, ISpecimenContext context)
{
var pi = request as ParameterInfo;
if (pi == null)
return new NoSpecimen(request);
if (pi.ParameterType != typeof(string) || pi.Name != "color")
return new NoSpecimen(request);
return "brown";
}
}