单元测试构造函数是否重要?

Nat*_*n W 73 .net c# constructor unit-testing

我应该对单元测试构造函数吗?说我有这样的构造函数:

IMapinfoWrapper wrapper;
public SystemInfo(IMapinfoWrapper mapinfoWrapper)
{
    this.wrapper = mapinfoWrapper;
}
Run Code Online (Sandbox Code Playgroud)

我是否需要为这位建筑师编写单元测试?我没有包装器变量的任何getter,所以我不需要测试它.

yfe*_*lum 96

单元测试是关于测试对象的公共状态,行为和交互.

如果您只是在构造函数中设置一个私有字段,那么有什么要测试的?

不要打扰单元测试你的简单访问器和mutator.那太傻了,对任何人都没有帮助.

  • 例如,如果构造函数具有if(条件),则需要测试两个流(true,false).如果你的构造函数在设置之前做了某种工作.你应该检查工作是否完成. (34认同)
  • 如果你在构造函数中有一个`checkArgumnt`(也许是为了测试对象是否为空)怎么办?值得测试吗? (2认同)

Bri*_*sio 38

是.如果构造函数中有逻辑,则应测试它.简单地设置属性不是逻辑IMO.条件,控制流等IS逻辑.

编辑: 您应该测试IMapinfoWrapper何时为null,如果需要该依赖项.如果是这样,那么这就是逻辑,你应该有一个测试来捕获你的ArgumentNullException或者其他......你的测试是定义代码行为方式的规范.如果它抛出ArgumentNullException,那么应该在测试中指定.

  • 我从来没有在构造函数中加入任何逻辑.只是二传手. (3认同)

Joh*_*mez 13

问:如果要在构造函数中设置成员变量,为什么要设置它.

答:因为你有一个失败的单元测试,只能通过在构造函数中设置它来传递.

如果您使用此逻辑,只编写代码以使单元测试通过(测试驱动开发),那么您已经有了问题的答案.


Dra*_*mon 8

不会.它的功能将通过课堂上的每个其他单元测试进行测试.

  • 并非每一个,如果里面有几个构造函数或几个控制流. (11认同)

小智 7

你绝对应该测试构造函数.如果您有默认构造函数,则应测试是否可以调用它.如果稍后更改类会怎么样 - 也许它会变成单例或删除默认构造函数而不是需要参数?在这种情况下,测试应该失败以警告该更改(以便可以修复类或测试以满足新要求).

默认构造函数的存在是应该进行测试的要求.即使所有构造函数都设置了将在其他地方测试的私有成员,也应测试存在无参数构造函数的事实.


Mar*_*son 6

这取决于。

我不会为像您给出的示例这样简单的东西编写专用的构造函数测试。

但是,如果您在构造函数中进行逻辑测试(例如参数验证),那么绝对可以。尽管像原始海报一样,如果可能的话,我不会在构造函数中进行任何工作,但通常必须完成参数验证。在这种情况下,不可避免地要阻止构造函数做一些工作。如果构造函数中有逻辑,那么它总是有可能是错误的,因此我像任何其他方法调用一样对待它并对其进行适当的测试。


Zor*_*vat 5

当构造函数包含逻辑时,我正在测试它们 - 例如验证或条件设置私有状态。验证错误最终会导致构造函数抛出异常。成功执行最终会创建一个对象,该对象根据构造函数中设置的状态表现出特定的行为。无论哪种方式,都需要测试。但构造函数测试很无聊,因为它们看起来都一样——调用构造函数,做出断言。测试方法声明通常比整个测试逻辑占用更多空间...因此我编写了一个简单的测试库,它有助于为构造函数编写声明性测试:How to Easy Test Validation Logic in Constructors in C#

这是一个示例,我在一个类的构造函数上尝试七个测试用例:

[TestMethod]
public void Constructor_FullTest()
{

    IDrawingContext context = new Mock<IDrawingContext>().Object; 

    ConstructorTests<Frame>
        .For(typeof(int), typeof(int), typeof(IDrawingContext))
        .Fail(new object[] { -3, 5, context }, typeof(ArgumentException), "Negative  length")
        .Fail(new object[] { 0, 5, context }, typeof(ArgumentException), "Zero length")
        .Fail(new object[] { 5, -3, context }, typeof(ArgumentException), "Negative width")
        .Fail(new object[] { 5, 0, context }, typeof(ArgumentException), "Zero width")
        .Fail(new object[] { 5, 5, null }, typeof(ArgumentNullException), "Null drawing context")
        .Succeed(new object[] { 1, 1, context }, "Small positive length and width")
        .Succeed(new object[] { 3, 4, context }, "Larger positive length and width")
        .Assert();

}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我可以测试构造函数的所有相关案例,而无需输入太多内容。