XUnit - Механизмы смешивания данных теории, входные и ожидаемые данные - PullRequest
0 голосов
/ 22 марта 2019

При создании тестовых случаев Theory с XUnit я хотел бы иметь возможность включать как параметры, так и ожидаемый результат для каждого случая.Я использовал атрибут InlineData, но для тяжелой загрузки конфигурации это не оптимально и не позволяет повторное использование.

[InlineData(1,2,3,4,5,6,7,...)]

Поэтому я перенес тестовые конфигурации в отдельный класс и теперь загружаю их с MemberData и MemberType.

[Theory]
[MemberData(nameof(DataClass.Data), MemberType = typeof(DataClass))]
public void TestValidConfig(Configuration config)
{
    ...
}

Однако это не позволяет мне указать ожидаемый результат, как я мог бы, если бы использовал базовый тег, т.е.

[InlineData("Input1", "Input2", "Input3", "ExpectedResult")]

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

Кто-нибудь получил решение этой проблемы?

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

1 Ответ

1 голос
/ 28 марта 2019

Вот предложение:

  1. Создать класс для генерации тестовых данных:
    internal static class TestData
    {
        public static IList<T> Get<T>(int count = 10)
        {
            // I'm using NBuilder here to generate test data quickly.
            // Use your own logic to create your test data.
            return Builder<T>.CreateListOfSize(count).Build();
        }
    }

Теперь все ваши тестовые классы могут использовать это для получения одинакового набора тестовых данных. Итак, в вашем классе данных вы будете делать что-то вроде

public class DataClass
{
    public static IEnumerable<object[]> Data()
    {
         return new List<object[]>
                {
                    new object[] { TestData.Get(), this.ExpectedResult() }
                };
    }
} 

Теперь вы можете выполнить исходный подход:

[Theory]
[MemberData(nameof(DataClass.Data), MemberType = typeof(DataClass))]
public void TestValidConfig(Data input, Configuration expected)
{
    ...
}

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

...