Как использовать Autofixture (v3) с ICustomization, ISpecimenBuilder для работы с параметром конструктора?
Я пытаюсь преодолеть сценарий, в котором класс имеет параметр конструктора строки, который не может быть удовлетворен какой-либо старой строкой, сгенерированной Autofixture (значение Guid-y looking).
Прежде чем вы захотите ответить просто со ссылкой наЗапись в блоге Марка Симанна Ploeh о кастомизированных настройкахПозвольте мне сказать, что я ссылался на него и другие записи в его блоге для этого теста, который я не могу пройти.
Когда я перехожу к отладке, я вижу, что в какой-то момент параметр конструктора передается с допустимым значением, но тест все равно не проходит со значением Guid-y Color. Я думаю, что это как-то связано с тем, что есть значение параметра «цвет»,а также свойство 'Color', которое будет заполнено автофиксом. Это то, что я написал ISpecimenBuilder, который обращается к параметру конструктора, но я проверяю значение открытого свойства (две разные вещи)?
Я знаю, что все это излишне для примера, но я представляю более сложный сценарий, в котором использованиеBuild<T>().With()
Метод не будет СУХОЙ.
Испытание на провал
[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());
}
}
Специфичный для типа String-конструктор с именем-цветом-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";
}
}