2010-02-18 44 views
4

我有一个类,它现在应该总是有一个特定的成员填充之前,它是有效的。为了执行此操作,类没有默认构造函数,而是有一个构造函数接受该必需成员的值。设置与此类似如下:在NUnit中测试不可编译的代码

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

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

现在我想编写一个测试,以确保有其实没有默认构造函数,因此,如果一个在未来被添加,提醒我们的没有理由背后的原因,并被迫考虑这样做的影响。尽管显然试图在测试中调用默认构造函数不会失败,但它不会编译。

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

想法?

+1

无论你想出什么解决方案,我都会建议记录类中缺少默认构造函数的重要性,以便您不依赖于未来可能运行或未运行的测试。当然,下一个开发人员可能会忽略其他级别的评论:-) – 2010-02-18 19:53:52

+0

应该在构建服务器上运行测试,以便如果失败,构建将会中断。依靠开发人员来运行测试总是一个坏主意 - 如果没有持续集成,单元​​测试将无法正常工作。 – womp 2010-02-18 20:26:27

+0

@womp:同意但运行在构建服务器上,或者不能单独测试仍然可以启用/禁用,这是我的观点。依靠项目其他部分的测试将继续进行下去并不无道理,但也不能保证。至少在课堂上的意见,你正在尽一切努力让人们意识到。因为未来的开发人员不会知道与特定测试存在相关的“原因”,所以可能比单独测试更为重要。我想,涵盖所有基地是我的观点。 – 2010-02-18 20:53:17

回答

10

您可以调用Activator.CreateInstance(typeof(MyClass))来尝试运行默认构造函数,并声明MissingMethodException被抛出。

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

-1,为什么调用它时,你可以简单地断言它不在那里? – 2013-03-09 10:58:59

+0

+1 - 正是我所需要的。要回答约翰,你可以这样做。既然人们可以选择一种或另一种,并且两种都回答问题,那么为什么你只需要一个有效的答案,因为它不是你选择的路径呢? – Dracorat 2014-05-07 23:46:50

0

,你可以使用反射来检查是否有该类的无参数的构造函数,如果有

9

我想创建一个默认的构造函数测试失败,其标记为私有,并把你的文档存在。那么你做这件事的原因不会隐藏在某个地方。你必须意识到你会放弃一些需要无参数构造函数的序列化功能。

+0

在这种情况下,我比单元测试概念更喜欢这种方式,因为单元测试通常会落在路边,而当您尝试更改它时,带有注释的代码在您的脸上也是正确的。毕竟,在这种情况下,你并没有试图测试功能,而是编程风格或编程规范,这并不是真正的单元测试。 – Nick 2010-02-18 19:50:35

+1

我更喜欢两者的组合。我总是假设测试应该记录商业原因。关于测试的好处是,它通过打破构建强制遵守。文档没有。 – womp 2010-02-18 20:27:40

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

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

相关问题