ReSharper 2022.2.3内置测试运行器不支持Assert.That的异步NUnit测试问题
ReSharper 2022.2.3 NUnit异步测试中
Assert.That断言失败显示异常的问题 问题现象
使用ReSharper 2022.2.3内置测试运行器执行NUnit异步测试时:
- 当使用
Assert.That断言失败时,仅提示“一个或多个子测试出错。异常无堆栈跟踪”,且失败的测试条目会消失,无法查看错误详情 - 使用
Assert.AreEqual则能正常显示失败的具体信息,包括预期值、实际值和堆栈跟踪
测试代码示例:
[TestFixture] public class ApiKeyMiddlewareTests { [Test] public async Task Invoke_ActiveKey_Authorized() { var httpContext = new DefaultHttpContext(); httpContext.Request.Headers.Add("XXXXX", "xxxx"); var configuration = Options.Create(new AccessConfiguration { ActiveApiKeys = new List<string> { "xxxx" } }); var middleware = new ApiKeyMiddleware(GetEmptyRequest(), configuration); await middleware.Invoke(httpContext); Assert.That(httpContext.Response.StatusCode, Is.EqualTo(200)); // 修改为非200值会触发异常显示问题 } }
问题原因
这是ReSharper 2022.2.x版本中针对NUnit异步测试的已知Bug,并非需要添加额外属性。核心原因是测试运行器在处理NUnit的Assert.That异步断言失败时,未能正确捕获和传递异常信息,导致测试上下文丢失。
解决方案
- 升级ReSharper版本:直接升级到2022.3及以上版本,该问题已在后续迭代中被官方修复
- 临时替代方案:在版本升级前,可临时改用
Assert.AreEqual等直接断言方法,或者使用NUnit的Assert.Multiple包裹Assert.That,强制保留测试失败上下文:
Assert.Multiple(() => { Assert.That(httpContext.Response.StatusCode, Is.EqualTo(200)); });
内容的提问来源于stack exchange,提问作者mikus
相关产品推荐
相关产品推荐

