You need to enable JavaScript to run this app. Unity NUnit测试:预期实际值均为0时Assert.AreEqual为何失败?
优惠活动
大模型
产品
解决方案
定价
更多

Unity NUnit测试:预期实际值均为0时Assert.AreEqual为何失败?

问题根因解析

核心矛盾:隐式类型推导的类型不匹配

C#中使用var声明的字面量0b0,因为没有指定类型后缀,编译器会默认将其推导为int类型,完全不是测试目标对应的byte类型。

NUnit框架的Assert.AreEqual实现逻辑和原生C#的==运算符的行为存在本质差异,尤其是Unity内置的NUnit 3.x版本,强化了相等判定的类型校验规则:

  • 原生==比较值类型时,编译器会自动完成隐式数值类型转换,将低精度的byte值隐式提升为int类型后,再和同为int类型的expected做值比较。两者值都是0,因此Assert.IsTrue(expected == GetByte())可以正常通过。
  • Assert.AreEqual的相等判定不会自动做跨类型的隐式转换,它会校验两个参数的实际类型是否匹配、是否符合对应类型的相等规则。本次场景中第一个参数是int类型的0,第二个参数是byte类型的0,类型不一致哪怕显示值完全相同,也会被判定为不相等,最终抛出“Expected: 0 But was: 0”的迷惑性报错。

Assert.AreSame()无法通过的原因

Assert.AreSame本质是比较两个对象的引用是否一致。对于值类型来说,传递到断言方法时会被强制装箱为堆上的对象,来自不同表达式的同值装箱对象天然是不同的引用,因此对值类型使用AreSame永远无法得到通过的结果,属于方法适用场景的使用误区,和本次的类型不匹配问题无关。

正确的测试代码写法

显式将expected的类型声明为byte,和GetByte()的返回值类型完全匹配,即可正常通过断言:

public void GetByteTest()
{
    byte expected = 0b0;

    Assert.AreEqual(expected, GetByte()); // 类型匹配、值相等,断言正常通过
}

注意事项:编写NUnit断言时,不要依赖C#的隐式数值转换逻辑,尽量保证断言的两个比较项类型完全一致,避免出现值显示相同但断言失败的异常情况。

内容的提问来源于stack exchange,提问作者hyperbeecore

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 00:54:08