请考虑以下内容:
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
),这有效地使得如果有人删除我上面所说的类的限制,那段代码就不能编译。