При настройке настраиваемого атрибута AutoDataAttribute для автоматического моделирования, какой правильный синтаксис указывает AutoFixture игнорировать все рекурсивные структуры?

У меня есть xUnit/Moq/AutoFixture, успешно работающие вместе, так что я автоматически смоделирую объекты с помощью входных параметров метода тестирования. Я создал кастом [AutoMoqData] атрибут, который я использую в каждом тесте. Вот код для атрибута:

using System.Linq;
using AutoFixture;
using AutoFixture.AutoMoq;
using AutoFixture.Xunit2;

namespace Shared.TestResources.AutoFixture
{
    public class AutoMoqDataAttribute : AutoDataAttribute
    {
        public AutoMoqDataAttribute() : base(() => new Fixture().Customize(new CompositeCustomization(new AutoMoqCustomization(), new SupportMutableValueTypesCustomization())))
        {
            this.Fixture.Behaviors.OfType<ThrowingRecursionBehavior>().ToList().ForEach(b => Fixture.Behaviors.Remove(b));
            this.Fixture.Behaviors.Add(new OmitOnRecursionBehavior());
        }
    }
}

Это работает, но я получаю следующее предупреждение компиляции: warning CS0618: 'AutoDataAttribute.Fixture' is obsolete: 'Fixture is created lazily for the performance efficiency, so this property is deprecated as it activates the fixture immediately. If you need to customize the fixture, do that in the factory method passed to the constructor.'

Я приглушил предупреждение, окружив его #pragma:

using System.Linq;
using AutoFixture;
using AutoFixture.AutoMoq;
using AutoFixture.Xunit2;

namespace Shared.TestResources.AutoFixture
{
    public class AutoMoqDataAttribute : AutoDataAttribute
    {
        public AutoMoqDataAttribute() : base(() => new Fixture().Customize(new CompositeCustomization(new AutoMoqCustomization(), new SupportMutableValueTypesCustomization())))
        {
#pragma warning disable 0618
            this.Fixture.Behaviors.OfType<ThrowingRecursionBehavior>().ToList().ForEach(b => Fixture.Behaviors.Remove(b));
            this.Fixture.Behaviors.Add(new OmitOnRecursionBehavior());
#pragma warning restore 0618
        }
    }
}

Тем не менее, я хочу установить это правильно и не делать вид, что предупреждение не существует. Проблема в том, что у меня проблемы с определением правильного синтаксиса для двух строк внутри #pragma,

Есть идеи?

1 ответ

Просто используйте лямбду с телом для дополнительной настройки fixture экземпляр перед возвратом:

public class AutoMoqDataAttribute : AutoDataAttribute
{
    public AutoMoqDataAttribute() : base(() =>
    {
        var fixture = new Fixture().Customize(new CompositeCustomization(
            new AutoMoqCustomization(),
            new SupportMutableValueTypesCustomization()));

        fixture.Behaviors.OfType<ThrowingRecursionBehavior>().ToList().ForEach(b => Fixture.Behaviors.Remove(b));
        fixture.Behaviors.Add(new OmitOnRecursionBehavior());

        return fixture;
    })
    {
    }
}

Таким образом, Fixture активация будет действительно ленивой, и вы получите ожидаемую оптимизацию производительности;-)

Другие вопросы по тегам