You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 11:47:50