如何通过Assert.ThrowsAsync捕获ValueTask方法抛出的ArgumentException?
解决ValueTask异步方法的异常断言问题
你的测试代码存在核心问题:未等待Assert.ThrowsAsync的异步任务完成,导致测试框架无法捕获方法抛出的异常,进而触发断言失败。
修正后的测试代码
[Fact] public async Task UploadFileAsync_WhenFileKeyParameterIsEmpty_ReturnArguementException() { string fileKey = ""; // 添加await等待异步任务完成,才能获取到抛出的异常实例 var ex = await Assert.ThrowsAsync<ArgumentException>(() => objHttpService.UploadFileAsync(fileKey)); Assert.Equal("The value cannot be null or empty. (Parameter 'fileName')", ex.Message); }
关键说明
Assert.ThrowsAsync返回的是Task<ArgumentException>类型的异步任务,只有通过await关键字等待任务执行完成,才能捕获到异步方法(包括方法内同步执行阶段抛出的异常)中的异常。- 原代码未等待异步任务,测试框架会判定没有异常抛出,因此出现"Expected: typeof(System.ArgumentException), Actual: (No exception was thrown)"的错误。
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

