为 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>
更改为 Task
或 async 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);
}
是否可以为理论案例指定 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>
更改为 Task
或 async 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);
}