Unity EditMode异步单元测试抛出异常却显示成功的原因及解决方法
问题分析与解决方案
首先明确:这不是Unity测试的正常行为,问题根源出在你使用了async void作为测试方法的返回类型。
为什么测试会显示SUCCESS?
Unity 2020.3版本的EditMode测试框架对async void方法的异常处理存在局限性:当async void方法执行到await语句时,会立即返回给测试框架,框架会误以为测试已经执行完成,直接标记为成功。而后续代码抛出的FormatException是在后台异步流程中发生的,测试框架无法捕获到这个异常,因此不会将测试修正为失败状态。
如何让测试在抛出异常时强制失败?
最规范且有效的解决方案是把测试方法的返回类型从async void改为async Task——Unity的测试框架能够正确处理async Task类型的测试,会等待异步操作完全完成,并捕获执行过程中抛出的任何异常,从而正确标记测试为失败。
修改后的代码示例:
[Test] public async Task TestGetHeroAssetResult() { var guid = Guid.Parse("123"); var result = await sut.GetHeroAsset(guid); Assert.AreEqual(result.AssetType, "type1"); }
特殊场景的替代方案(不推荐)
如果因为某些特殊原因必须保留async void,可以手动捕获异常并通过Assert.Fail()主动标记测试失败:
[Test] public async void TestGetHeroAssetResult() { try { var guid = Guid.Parse("123"); var result = await sut.GetHeroAsset(guid); Assert.AreEqual(result.AssetType, "type1"); } catch (Exception ex) { Assert.Fail($"测试抛出异常:{ex.Message}"); } }
不过还是优先推荐使用async Task,这是异步测试的标准写法,能避免很多潜在的异步流程问题。
内容的提问来源于stack exchange,提问作者Mol0ko
相关产品推荐
相关产品推荐

