我正在尝试克服一个场景,其中一个类具有一个字符串构造函数参数,该参数不能被 Autofixture 生成的任何旧字符串(Guid-y 外观值)所满足。
在您想简单地通过Mark Seemann 的 Ploeh 博客文章的基于约定的定制的链接来回答之前,让我说我一直在参考它和他的其他博客文章来进行这个测试,我无法访问经过。
当我单步调试时,我可以看到在某些时候构造函数参数传入了有效值,但测试仍然失败,并显示 Guid-y 颜色值。我认为这与Autofixture 填充“颜色”参数值和“颜色”属性有关。是不是我编写了一个解决构造函数参数的 ISpecimenBuilder,但我正在测试公共属性值(两个不同的东西)?
我知道所有这些对于示例来说都是多余的,但我设想了一个更复杂的场景,使用该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";
}
}