在NUnit中测试不可编译的代码

时间:2010-02-18 19:45:01

标签: c# .net unit-testing nunit

我有一个类,现在应该总是在某个成员有效之前填充某个成员。为了强制执行此操作,该类没有默认构造函数,而是具有一个构造函数,该构造函数接受该必需成员的值。设置类似于以下内容:

public class MyClass
{
  public string Owner { get; protected set; }

  public MyClass(string owner)
  {
    this.Owner = owner;
  }
}

现在我想写一个测试来确保实际上没有默认构造函数,所以如果将来添加一个,我们会被提醒没有一个的原因,并被迫考虑影响这样做。虽然,显然尝试在测试中调用默认构造函数不会失败,但它不会编译。

有没有一种很好的方法可以在不修改原始课程的情况下完成这种测试?如果没有,我想我可以实现一个抛出异常的默认构造函数。我唯一犹豫的是调用默认构造函数现在变成了可编译代码,然后我们必须依赖其他测试来确保这些代码不会被编写。

思想?

6 个答案:

答案 0 :(得分:10)

您可以调用Activator.CreateInstance(typeof(MyClass))尝试运行默认构造函数,并断言抛出MissingMethodException

[Test]
[ExpectedException(typeof(MissingMethodException))
public void ShouldBeNoDefaultConstructorForMyClass()
{
    Activator.CreateInstance(typeof(MyClass));
}

答案 1 :(得分:9)

我会创建一个默认构造函数,将其标记为private并将文档放在那里。那么你做这件事的理由不会隐藏在某个地方。你必须意识到你将放弃一些需要无参数构造函数的序列化功能。

答案 2 :(得分:5)

ConstructorInfo ci = typeof(MyClass).GetConstructor(Type.EmptyTypes);
Assert.IsNull(ci);

答案 3 :(得分:1)

答案 4 :(得分:0)

你可以使用反射来检查类是否有没有arg构造函数,如果有

则测试失败

答案 5 :(得分:0)

是的。一个好方法是使用反射来尝试try / catch中的无参数构造函数。