Assert.AreEqual在比较枚举和int时不会失败

时间:2010-06-01 21:48:07

标签: c# .net

我不确定这是否可行,但我只是试一试。

我正在调用Assert.AreEqual()方法。 对于参数,我正在通过......

  1. 一个枚举值,其中Int32作为基础类型,因为我没有指定基类型
  2. 一个int(Int32)值
  3. 断言失败,因为它看到枚举不是int (这绝对是正确的)。
    但是,当枚举具有正确的int值作为第二个参数时,有没有办法使这个Assert通过?

    我可以将枚举转换为int并快速修复,但它真的很难看。
    我期待某种方法覆盖Assert用于比较2个不同对象的方法,并隐式地使该枚举类型看起来像int。然而,到目前为止,我没有成功找到任何提示/答案
    有人建议create a type converter并使用TypeConverterAttribute来解决问题。如果这是肯定的,并且是唯一的方法,我会;然而,这看起来似乎有很多不必要的工作。

2 个答案:

答案 0 :(得分:6)

通过调用Assert.AreEqual(enum, int),您正在调用Assert.AreEqual(object, object)方法,因为没有包含enumint参数的重载。

我不认为将enum投射到int是丑陋的 - 实际上我认为这是完全可以接受的并且是一种非常常见的技术。如果你正在进行正常的相等比较(即1 == MyEnum.Value),你会得到一个编译器错误,因为没有隐式转换,只有一个需要强制转换的显式转换。

类型转换器可能有效,但您需要问问自己,这样做是否真的可以为您所涉及的工作量带来任何实际好处。就个人而言,我只会将演员留给int

如果你断言类似方法调用的返回值,为什么不根据你期望的值断言呢?

MyEnum actual = SomeMethod();
Assert.AreEqual(MyEnum.Value, actual);

这不需要强制转换,因为两种类型相同,并且您声明了预期值。

答案 1 :(得分:0)

  

我期待某种方法覆盖Assert用于比较2个不同对象的方法,并隐式地使该枚举类型看起来像int。

这不起作用,因为Assert.AreEqual是一个静态方法,你不能覆盖静态方法,也不能通过扩展方法为静态方法添加重载。

无论如何,即使你可以,也会违反Assert.AreEqual的合同。您希望Assert.AreEqual(myEnum.One, 1)生成为真,但myEnum.One.Equals(1)1.Equals(myEnum.One)都返回false。那是不一致的。

投射到int并不难看,这是解决问题的正确方法。毕竟,您想要检查枚举的数值是否与某个整数匹配。如果这是您要检查的内容,请将其写下来。