Как заполнить xUnit [Теория] и [Линейные данные] значениями из метода

#c# #xunit

Вопрос:

Есть ли способ ввести данные в [InlineData] значения для тестов xUnit? Кажется, я не могу этого сделать, так как для этого требуются константы.

Комментарии:

1. [ClassData] или [MemberData] ?

2. Теория xUnit: Работа С Линейными Данными, Данными участников, Данными классов

Ответ №1:

Для вызова методов в качестве данных вы должны использовать [MemberData] , а не [InlineData] . В MemberData вы можете указать функцию via nameof , которая возвращает ожидаемые параметры в качестве результата.

     public static IEnumerable<object[]> GetNumbers()
    {
        yield return new object[] { 5, 1, 3, 9 };
        yield return new object[] { 7, 1, 5, 3 };
    }

    [Theory]
    [MemberData(nameof(GetNumbers))]
    public void AllNumbers_AreOdd_WithMemberData(int a, int b, int c, int d)
    {
        Assert.True(IsOddNumber(a));
        Assert.True(IsOddNumber(b));
        Assert.True(IsOddNumber(c));
        Assert.True(IsOddNumber(d));
    }
 

Я не уверен, но если я правильно помню, функция , которую вы вызываете, должна возвращать IEnumerable<object[]> , которую xUnit будет сортировать по параметрам теста, и вы должны использовать yield return , если хотите использовать несколько наборов данных.