Ответ 1
Как правильно указал @DavidOsborne, поведение, которое вы видите, сконструировано.
Лучший подход - организовать ваши настройки в отдельных классах, а затем включить их по мере необходимости с помощью конкретного тестового сценария.
Объект настройки реализует интерфейс ICustomization
и его задачей является настройка объекта Fixture
определенным образом. Вот пример:
public class AllPersonsAreNamedBen : ICustomization
{
public void Customize(IFixture fixture)
{
fixture.Customize<Person>(composer =>
composer.With(p => p.Name, "Ben"));
}
}
public class AllPersonsAreBornIn1900 : ICustomization
{
public void Customize(IFixture fixture)
{
fixture.Customize<Person>(composer =>
composer.With(p => p.DateOfBirth, new DateTime(1900, 1, 1)));
}
}
Вы можете включить настройку на конкретном Fixture
с помощью метода Customize
, например:
fixture.Customize(new AllPersonsAreNamedBen());
или:
fixture.Customize(new AllPersonsAreBornIn1900());
Вы также можете объединить несколько настроек в новый с помощью класса CompositeCustomization
:
public class AllPersonsAreNamedBenAndAreBornIn1900 : CompositeCustomization
{
public AllPersonsAreNamedBenAndAreBornIn1900()
: base(new AllPersonsAreNamedBen(),
new AllPersonsAreBornIn1900())
{
}
}
в этот момент вы можете просто сказать:
fixture.Customize(new AllPersonsAreNamedBenAndAreBornIn1900());
Однако имейте в виду, что порядок, в котором применяются настройки на Fixture
: последний выигрывает и может потенциально переопределять предыдущие, как отметил @MarkSeemann в комментариях. Это тоже по дизайну.
Таким образом, хотя вы можете комбинировать существующие настройки, которые работают с разными типами, в этом конкретном случае, поскольку обе настройки нацелены на один и тот же тип, вам нужно будет создать новую настройку для инкапсуляции всех параметров для типа Person
сочетании:
public class AllPersonsAreNamedBenAndAreBornIn1900 : CompositeCustomization
{
public void Customize(IFixture fixture)
{
fixture.Customize<Person>(composer =>
composer.With(p => p.Name, "Ben")
.With(p => p.DateOfBirth, new DateTime(1900, 1, 1)));
}
}
Как правило, ваши настройки небольшие и сфокусированные позволяют повторно использовать их в разных тестах, объединяя их для конкретных тестовых сценариев.