Я пытаюсь преодолеть сценарий, в котором класс имеет параметр конструктора строк, который не может быть удовлетворен какой-либо старой строкой, сгенерированной Autofixture (ориентировочное значение Guid-y).
Прежде чем соблазняться ответить просто ссылкой на запись блога Mark Seemann Ploeh на основе настроек на основе Конвенции, позвольте мне сказать, что я ссылался на нее и другие записи в блоге его для этого теста, которые я не могу пройти.
Когда я перехожу к отладке, я вижу, что в какой-то момент параметр конструктора передается с допустимым значением, но тест по-прежнему не выполняется с помощью значения Guid-y Color. Я думаю, что это имеет какое-то отношение к тому факту, что есть значение параметра "цвет" и свойство "Цвет", которое будет заполнено Autofixture. Разве это то, что я написал 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()) { }
}
Специализация, специфичная для Leaf
public class LeafColorCustomization : ICustomization
{
public void Customize(IFixture fixture)
{
if (fixture == null)
throw new ArgumentNullException("fixture");
fixture.Customizations.Add(new LeafBuilder());
}
}
String-constructor-with-name-of-Color-specific 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";
}
}