xUnit 不接受 returns Task<> 方法的同步抛出
xUnit does not accept synchronous Throws with method that returns Task<>
我正在为 returns Task<>
但不是 async
的方法编写单元测试。 xUnit.net 仍然希望我使用 ThrowsAsync
来检查抛出的异常:
Error CS0619 'Assert.Throws(Func)' is obsolete: 'You must call Assert.ThrowsAsync (and await the result) when testing async code.'
方法returns一个Task<>
因为它是一个接口的实现,其中一些实现确实运行async
.
这是界面:
public interface IPtlCommand
{
Task<PtlResult> Execute(string[] args);
}
和实施:
public class SetTag : IPtlCommand
{
public Task<PtlResult> Execute(string[] args)
{
return Task.FromResult<PtlResult>(new PtlResult());
}
}
我的测试代码(给出编译器错误):
[Fact]
public void SetTag_ThrowsArgumentExceptionWhenNoTag()
{
var command = new SetTag();
// act & assert
Assert.Throws<ArgumentException>(() => command.Execute(new string[] { "host" }));
}
对 command.Execute
调用的其他测试也能正常工作,即使没有 await
。
如果您使用的是 Visual Studio,它会建议快速操作 来解决问题。如果您要求它实施该建议,它将更改测试:
[Fact]
public async Task SetTag_ThrowsArgumentExceptionWhenNoTag()
{
var command = new SetTag();
// act & assert
await Assert.ThrowsAsync<ArgumentException>(
() => command.Execute(new string[] { "host" }));
}
此测试现在可以编译(并且失败,因为 Execute
不会抛出异常)。
我正在为 returns Task<>
但不是 async
的方法编写单元测试。 xUnit.net 仍然希望我使用 ThrowsAsync
来检查抛出的异常:
Error CS0619 'Assert.Throws(Func)' is obsolete: 'You must call Assert.ThrowsAsync (and await the result) when testing async code.'
方法returns一个Task<>
因为它是一个接口的实现,其中一些实现确实运行async
.
这是界面:
public interface IPtlCommand
{
Task<PtlResult> Execute(string[] args);
}
和实施:
public class SetTag : IPtlCommand
{
public Task<PtlResult> Execute(string[] args)
{
return Task.FromResult<PtlResult>(new PtlResult());
}
}
我的测试代码(给出编译器错误):
[Fact]
public void SetTag_ThrowsArgumentExceptionWhenNoTag()
{
var command = new SetTag();
// act & assert
Assert.Throws<ArgumentException>(() => command.Execute(new string[] { "host" }));
}
对 command.Execute
调用的其他测试也能正常工作,即使没有 await
。
如果您使用的是 Visual Studio,它会建议快速操作 来解决问题。如果您要求它实施该建议,它将更改测试:
[Fact]
public async Task SetTag_ThrowsArgumentExceptionWhenNoTag()
{
var command = new SetTag();
// act & assert
await Assert.ThrowsAsync<ArgumentException>(
() => command.Execute(new string[] { "host" }));
}
此测试现在可以编译(并且失败,因为 Execute
不会抛出异常)。