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
相关产品推荐
相关产品推荐

