我不理解以下测试的行为(使用xUnit.net用C#编写)。我认为ThrowsWrappingException
会通过而ThrowsCustomException
会失败。相反,它们具有相反的行为:ThrowsWrappingException
在ThrowsCustomException
通过时失败。
为什么?
[Fact]
public async Task ThrowsWrappingException() =>
await Assert.ThrowsAsync<WrappingException>(InterceptException);
[Fact]
public async Task ThrowsCustomException() =>
await Assert.ThrowsAsync<CustomException>(InterceptException);
private async Task InterceptException() {
var task = ThrowCustomException();
await Task.WhenAll(task);
throw new WrappingException(task.Exception);
}
private Task ThrowCustomException() =>
throw new CustomException();
private class WrappingException : Exception {
public WrappingException(Exception e)
: base(e.Message, e) { }
}
private class CustomException : Exception { }
答案 0 :(得分:1)
这是因为行
throw new WrappingException(task.Exception)
永远不会执行,因为未处理的CustomException将被包装在AggregateException中并传播给调用者(单元测试),我猜,它将解压缩并检测到它是一个CustomException,然后终止。
所以throw语句永远不会执行;你可以添加一个try-catch块来改变它。