Тесты AutoFixture перестают отображаться в Test Runner

AutoFixture (или мое неправильное его использование), по-видимому, привело к тому, что средство запуска тестов xunit перестало показывать отдельные тесты в древовидном представлении для каждого экземпляра встроенных данных. Обычно, если я использую [Theory] и [InlineData], я получаю отдельные тесты, отображаемые в представлении дерева запуска тестов, по одному для каждого [InlineData]. Это больше не происходит после следующего:

Я создал собственный класс AutoMoqDataAttribute, чтобы всегда использовать AutoMoqCustomization и отключить рекурсию:

public sealed class AutoMoqDataAttribute : AutoDataAttribute
{
    /// <summary>
    /// Automaticaly adds the "Auto Moq" customization to fixures that use the
    /// AutoDataAttribute attribute.
    /// </summary>
    public AutoMoqDataAttribute() : base(() =>
    {
        // Create a fixture we can customize.
        var fixture = new Fixture();

        // Remove the recursion checks as we have objects that require recursion.
        var throwingRecursionBehavior = fixture.Behaviors.FirstOrDefault(behavior => behavior.GetType() == typeof(ThrowingRecursionBehavior));
        if (throwingRecursionBehavior != null) fixture.Behaviors.Remove(throwingRecursionBehavior);

        // Have to also add in the OmitOnRecursionBehavior to avoid a stack overflow error
        // presumably, since we removed the above, and without this, AutoFixture follows every
        // object and just keeps trying to auto fill its data. By following the circular
        // references it just goes on forever.
        fixture.Behaviors.Add(new OmitOnRecursionBehavior());

        // Use the "Auto Moq" customization so we have AutoFixture automatically mock objects for us.
        fixture.Customize(new AutoMoqCustomization());

        return fixture;
    }) { }
}

Затем я хочу, чтобы это работало, когда я использую Theory/InlineData, поэтому я также создаю это:

    public class InlineAutoMoqDataAttribute : InlineAutoDataAttribute
    {
        public InlineAutoMoqDataAttribute(params object[] values) : base(new AutoMoqDataAttribute(), values) { }
    }

Наконец, я пытаюсь запустить несколько тестов:

    public class TestClass
    {
        public bool Val { get; set; }
    }

    [Theory]
    [InlineData("blah 1", true)]
    [InlineData("blah 2", true)]
    public void Test1(string dummy, bool expected)
    {
        Assert.Equal(expected, true);
    }

Вышеприведенное работает нормально... но затем я запускаю это:

    [Theory]
    [InlineAutoMoqData("blah 1", false)]
    [InlineAutoMoqData("blah 2", false)]
    public void Test2(string dummy, bool expected, TestClass sut)
    {
        Assert.Equal(expected, sut.Val);
    }

Тесты выполняются, но я не вижу двух тестов, по одному для каждого InlineAutoMoqData, в средстве запуска тестов, как обычно. Я могу увидеть их, если щелкну тест и посмотрю на панель сводки сведений о тесте, что почти достаточно, за исключением того, что я не могу повторно запустить неудачные тесты (я имею в виду тесты для отдельных случаев InlineData) оттуда. Я могу из древовидного представления, но опять же, они там не отображаются, так что это большая проблема, поскольку он запускает все тесты InlineAutoMoqData, и я хочу изолировать и просто запустить, например. тот, который терпит неудачу.

Если я добавлю этот атрибут:

[DataDiscoverer (Xunit.Sdk.InlineDataDiscoverer, xunit.core)]

к моему InlineAutoMoqDataAttribute отдельные тесты, по одному для каждого InlineAutoMoqData, отображаются в проводнике тестов, но затем я получаю эту ошибку:

InvalidOperationException : метод тестирования ожидал 2 значения параметра, но было предоставлено 1 значение параметра.

это означает, что автоматические фиктивные значения AutoFixture не работают.

Есть ли способ, чтобы мой пользовательский атрибут InlineAutoMoqData по-прежнему имел тесты для каждого отдельного InlineAutoMoqData, отображаемого в проводнике тестов? Это ошибка, о которой я должен сообщить в AutoFixture, или я делаю что-то не так?


person Kairei    schedule 01.10.2020    source источник


Ответы (1)


Это известная проблема в AutoFixture, хотя я не уверен, что в репозитории GitHub открыта официальная проблема. Если таковой нет, вы можете создать задачу и отслеживать прогресс по ней там.

person Andrei Ivascu    schedule 25.11.2020
comment
Спасибо, Андрей! Я создал проблему 1210 на сайте AutoFixture github (github.com/AutoFixture/AutoFixture/issues/ 1210). - person Kairei; 28.11.2020