为 xUnit 理论测试指定 return 值

Specifying the return value for xUnit Theory tests

是否可以为理论案例指定 return 值?就像我有测试方法:

[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.

您可以稍微重写您的测试,方法是添加预期结果的参数并将其与 Assert 中的值进行比较,return 从 DoStuffAsync 方法中编辑。另外不要忘记将测试方法的 return 值从 Task<bool> 更改为 Taskasync void,因为您正在检查测试中的 return 值return 什么都没有

[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);
}

您不能为理论测试用例指定 return 值,但您可以添加一个类似于预期值的参数,并将测试输出与该值进行比较。在这种情况下,测试将如下所示:

[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);
}

这将告知框架预期值是否等于 DoStuffAsync 方法生成的实际值。 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);
}