Указание возвращаемого значения для тестов xUnit Theory - PullRequest
2 голосов
/ 20 апреля 2020

Можно ли указать возвращаемое значение для теоретического случая? Как у меня есть метод тестирования:

[Theory]
[MemberData(nameof(TestCases))]
public async Task<bool> Test(int i, double d, string str)
{
    return DoStuffAsync(i, d, str);
}

и метод

public static IEnumerable<object[]> TestCases()
{
    yield return new object[] { 1, Math.PI, "case1", true };
    yield return new object[] { 2, Math.E,  "case2", false };
}

для создания тестовых случаев.

Но если я попытаюсь запустить эти тестовые случаи, Я получаю ошибку

System.InvalidOperationException : The test method expected 3 parameter values, but 4 parameter values were provided.

Ответы [ 2 ]

4 голосов
/ 20 апреля 2020

Вы можете немного переписать свой тест, добавив параметр для ожидаемого результата и сравнить его в Assert со значением, возвращаемым методом DoStuffAsync. Также не забудьте изменить возвращаемое значение для метода тестирования с Task<bool> на Task или async void, так как вы проверяете возвращаемое значение внутри теста и ничего не возвращаете

[Theory]
[MemberData(nameof(TestCases))]
public async Task Test(int i, double d, string str, bool expected)
{
    var result = await DoStuffAsync(i, d, str);
    Assert.Equal(expected, result);
}
2 голосов
/ 20 апреля 2020

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

[Theory]
[MemberData(nameof(TestCases))]
public async Task Test(int i, double d, string str, bool expectedValue)
{
     bool actualValue = DoStuffAsync(i, d, str);
     Assert.True(actualValue == expectedValue);
}

Это сообщит платформе, если ожидаемое значение равно фактическому значению, полученному методом DoStuffAsyn c. Оператор Assert используется для оценки того, пройден или не пройден тест.

Еще один, возможно, гораздо более удобный в обслуживании подход - разделить один тест на два. В первом случае вы можете ожидать, что вывод метода будет истинным для каждого случая, а во втором вы можете ожидать, что результат будет ложным для каждого случая.

Первый тест должен выглядеть следующим образом

[MemberData(nameof(TestCasesTrue))]
public async Task TestTrue(int i, double d, string str)
{
     bool actualValue = DoStuffAsync(i, d, str);
     Assert.Equal(true, actualValue);
}

И второй тест должен выглядеть следующим образом:

[MemberData(nameof(TestCasesFalse))]
public async Task TestFalse(int i, double d, string str)
{
     bool actualValue = DoStuffAsync(i, d, str);
     Assert.Equal(false, actualValue);
}
...