Есть ли способ сказать 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);
}
Другие вопросы по тегам