【发布时间】:2010-10-27 15:14:07
【问题描述】:
考虑:
class MyClass<T> where T : class
{
}
在这种情况下,where 子句强制说明 MyClass 只是引用类型的泛型。
理想情况下,我应该有一个单元测试来测试这个规范。但是,这个单元测试显然不起作用,但它解释了我想要完成的事情:
[Test]
[DoesNotCompile()]
public void T_must_be_a_reference_type()
{
var test = new MyClass<int>();
}
我可以做些什么来测试通过不允许代码编译来实现的规范?
编辑:
更多信息:好的,所以我这样做的理由(哈哈)是我一直在遵循 TDD 方法,在这种方法中你不能编写任何代码,除非你有一个失败的单元测试。假设你有这个:
class MyClass<T> { }
除非 T 是一个类,否则你可以编写什么测试会失败? default(T) == null 之类的东西?
进一步编辑:
因此,在对此进行“根本原因分析”之后,问题是我以隐含的方式依赖 default(T) 在此类的消费者中成为 null。我能够将该消费者代码重构到另一个类中,并在那里指定一个泛型类型限制(将其限制为class),如果有人要删除我在上面谈论的类的限制,这实际上会使该代码无法编译.
【问题讨论】:
-
你为什么不对这个类命名为
MyClass进行单元测试? -
@SLaks:技术上 var test = new MyClass
();会测试,不是吗? -
我认为@SLaks 正在使用讽刺来证明您不需要测试编译器的观点......这是微软的工作。
-
@TheCloudlessSky:我的意思是,如果您遵循 TDD,除非您编写了第一个单元测试,否则您不会创建该类,除非您使用一个不存在的类的名称。所以是的,你的第一个单元测试隐式地测试了类的名称。
标签: c# unit-testing tdd