【问题标题】:Assert.AreEqual<T> (and Related Generic Functions) Don't Enforce Their Argument TypesAssert.AreEqual<T>(和相关的泛型函数)不强制它们的参数类型
【发布时间】:2012-09-19 12:16:22
【问题描述】:

我正在编写一些单元测试,实际上我正在重构后修复单元测试,我注意到一些非常奇怪的行为。原始断言使用了 AreEqual 方法的非泛型风格。

Assert.AreEqual(Foo.Do(...), Bar.Do(...).Conversion(...));

经过一些重构,Foo.Do() 不再返回相同的类型,需要额外的转换来保持等价。但是,AreEquals 函数很乐意接受任何对象,因此测试在运行时失败,而不是像人们希望的那样在编译时失败。

因此,我决定将断言更改为它们的通用对应项,以强制将来此类更改会变成编译时错误。

Assert.AreEqual<X>(Foo.Do(...), Bar.Do(...).Conversion(...));

此时,我还没有更改 Foo.Do() 以返回正确的类型,所以我应该得到一个编译错误,即 Foo.Do() 的返回不是 X。令我惊讶的是,没有任何反应.编译成功就好了。我假设某处的类型之间必须存在隐式转换,但一些实验表明没有。我已经尝试了一些其他模拟示例,看看是否具有非泛型和泛型风格的函数会以这种方式进行交互,但我无法重现这种行为,除非使用这个类。

为什么编译器不强制这两个值都是 X 类型,即使如果你将鼠标悬停在 Visual Studio 中的函数上看起来就是这样?

【问题讨论】:

  • 你能发布一个最小版本的X 类(也许还有 Foo.Do() 的返回值的类)来重现这个吗?

标签: c# unit-testing generics type-conversion


【解决方案1】:

经过一番令人沮丧的搜索后,我最终在一组扩展方法中发现了一个隐式转换,这些方法被另一个测试中的另一行代码拉入,与手头的类型完全无关。从那以后,我与那个进行黑客攻击的人交谈过。另一个隐式转换失败。

【讨论】:

    猜你喜欢
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2021-06-27
    • 2020-08-22
    • 1970-01-01
    • 2023-01-28
    相关资源
    最近更新 更多