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

У меня успешно работает 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 Ответ

0 голосов
/ 26 января 2019

Просто используйте лямбду с телом для дополнительной настройки экземпляра 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 будет действительно ленивой, и вы получите ожидаемую оптимизацию производительности;-)

...