代码测试中的一些错误引发了这个问题,由于代码的扩展,这里有一个完整的项目,它完全复制了我们遇到的问题(以节省您分析大量行的时间)。
问题是当试图从异步方法中捕获异常时,这里是 AsyncTest.cs
文件:
using System;
using Xunit;
namespace AsyncTest
{
public class AsyncTest
{
[Fact]
public void ProbeTest()
{
// Arrange
var probe = new Probe();
// Act
Action action = async () =>
await probe.GetJob();
// Assert
var ex = Assert.Throws<InvalidOperationException>(action);
Assert.Contains("Trouble with Project.", ex.Message);
}
}
}
现在,
Probe.cs
要测试的类(注意 GetById
方法调用的延迟和异常抛出 GetJob
方法):using System;
using System.Threading.Tasks;
namespace AsyncTest
{
class Probe
{
public async Task<MyResult<Guid>> GetJob()
{
var etlJob = await GetById("id");
return new MyResult<Guid>(etlJob);
}
public async Task<Guid> GetById(string id)
{
await Task.Delay(200);
throw new InvalidOperationException("Trouble with Project.");
}
}
}
最后,
MyResult.cs
Probe.cs
使用的类.namespace AsyncTest
{
public class MyResult<T>
{
private T _value;
public MyResult(T Value)
{
_value = Value;
}
public string Message { get; set; }
public T Data { get; set; }
}
}
显然,即使
await Task.Delay(200);
,测试也会在抛出异常之前结束。行被删除。在某些情况下,使用多个断点并将调用置于循环中,会抛出异常但测试未检测到。它看起来像是同步和异步混合,但无法弄清楚到底是什么。
提前致谢。
最佳答案
尝试使您的测试方法异步并等待断言:
[Fact]
public async Task ProbeTest()
{
// Arrange
var probe = new Probe();
// Act
Func<Task> action = async () => await probe.GetJob();
// Assert
var ex = await Assert.ThrowsAsync<InvalidOperationException>(action);
Assert.Contains("Trouble with Project.", ex.Message);
}
关于c# - 无法使用 Xunit 在异步方法中断言异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62033219/