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

Jam*_*ney 4 .net c# nunit unit-testing

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

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

  public MyClass(string owner)
  {
    this.Owner = owner;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

思考?

wom*_*omp 10

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

[Test]
[ExpectedException(typeof(MissingMethodException))
public void ShouldBeNoDefaultConstructorForMyClass()
{
    Activator.CreateInstance(typeof(MyClass));
}
Run Code Online (Sandbox Code Playgroud)


No *_*rns 9

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


pli*_*nth 5

ConstructorInfo ci = typeof(MyClass).GetConstructor(Type.EmptyTypes);
Assert.IsNull(ci);
Run Code Online (Sandbox Code Playgroud)