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, или я делаю что-то не так?