代码之家  ›  专栏  ›  技术社区  ›  James Maroney

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

  •  4
  • James Maroney  · 技术社区  · 16 年前

    我有一个类,在它有效之前,它应该一直填充某个成员。为了实现这一点,类没有默认构造函数,而是有一个接受所需成员值的构造函数。设置如下所示:

    public class MyClass
    {
      public string Owner { get; protected set; }
    
      public MyClass(string owner)
      {
        this.Owner = owner;
      }
    }
    

    现在我想编写一个测试来确保实际上没有默认构造函数,因此如果将来添加一个构造函数,我们会想起没有一个默认构造函数的原因,并被迫考虑这样做的影响。尽管很明显,在测试中调用默认构造函数不会失败,也不会编译。

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

    6 回复  |  直到 16 年前
        1
  •  10
  •   womp    16 年前

    你可以打电话 Activator.CreateInstance(typeof(MyClass)) 尝试运行默认构造函数,并断言 MissingMethodException

    [Test]
    [ExpectedException(typeof(MissingMethodException))
    public void ShouldBeNoDefaultConstructorForMyClass()
    {
        Activator.CreateInstance(typeof(MyClass));
    }
    
        2
  •  9
  •   No Refunds No Returns    16 年前

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

        3
  •  5
  •   plinth    16 年前
    ConstructorInfo ci = typeof(MyClass).GetConstructor(Type.EmptyTypes);
    Assert.IsNull(ci);
    
        5
  •  0
  •   Sam Holder Brian Adams    16 年前

    您可以使用反射检查类是否有无参数构造函数,如果有,则测试失败

        6
  •  0
  •   Nick W    16 年前

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