Есть ли способ сказать Autofixture, чтобы установить свойства только с определенным атрибутом?
Я использую Unity для внедрения зависимостей, и в некоторых местах я использую свойства (с [Dependency]
атрибут), а не инжектор конструктора.
Я хотел бы использовать AutoFixture в качестве контейнера для проверки для моих модульных тестов, но по умолчанию он устанавливает все общедоступные свойства в тестируемой системе. Я знаю, что могу явно исключить определенные свойства, но есть ли способ включить только свойства, которые имеют [Dependency]
атрибут?
1 ответ
Решение
Это работает:
public class PropertyBuilder : ISpecimenBuilder
{
public object Create(object request, ISpecimenContext context)
{
var pi = request as PropertyInfo;
if (pi != null)
{
if (pi.IsDefined(typeof (DependencyAttribute)))
return context.Resolve(pi.PropertyType);
//"hey, don't set this property"
return new OmitSpecimen();
}
//"i don't know how to handle this request - go ask some other ISpecimenBuilder"
return new NoSpecimen(request);
}
}
fixture.Customizations.Add(new PropertyBuilder());
Прецедент:
public class DependencyAttribute : Attribute
{
}
public class TestClass
{
[Dependency]
public string With { get; set; }
public string Without { get; set; }
}
[Fact]
public void OnlyPropertiesWithDependencyAttributeAreResolved()
{
// Fixture setup
var fixture = new Fixture
{
Customizations = {new PropertyBuilder()}
};
// Exercise system
var sut = fixture.Create<TestClass>();
// Verify outcome
Assert.NotNull(sut.With);
Assert.Null(sut.Without);
}