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.那太傻了,对任何人都没有帮助.
Bri*_*sio 38
是.如果构造函数中有逻辑,则应测试它.简单地设置属性不是逻辑IMO.条件,控制流等IS逻辑.
编辑: 您应该测试IMapinfoWrapper何时为null,如果需要该依赖项.如果是这样,那么这就是逻辑,你应该有一个测试来捕获你的ArgumentNullException或者其他......你的测试是定义代码行为方式的规范.如果它抛出ArgumentNullException,那么应该在测试中指定.
Joh*_*mez 13
问:如果要在构造函数中设置成员变量,为什么要设置它.
答:因为你有一个失败的单元测试,只能通过在构造函数中设置它来传递.
如果您使用此逻辑,只编写代码以使单元测试通过(测试驱动开发),那么您已经有了问题的答案.
小智 7
你绝对应该测试构造函数.如果您有默认构造函数,则应测试是否可以调用它.如果稍后更改类会怎么样 - 也许它会变成单例或删除默认构造函数而不是需要参数?在这种情况下,测试应该失败以警告该更改(以便可以修复类或测试以满足新要求).
默认构造函数的存在是应该进行测试的要求.即使所有构造函数都设置了将在其他地方测试的私有成员,也应测试存在无参数构造函数的事实.
这取决于。
我不会为像您给出的示例这样简单的东西编写专用的构造函数测试。
但是,如果您在构造函数中进行逻辑测试(例如参数验证),那么绝对可以。尽管像原始海报一样,如果可能的话,我不会在构造函数中进行任何工作,但通常必须完成参数验证。在这种情况下,不可避免地要阻止构造函数做一些工作。如果构造函数中有逻辑,那么它总是有可能是错误的,因此我像任何其他方法调用一样对待它并对其进行适当的测试。
当构造函数包含逻辑时,我正在测试它们 - 例如验证或条件设置私有状态。验证错误最终会导致构造函数抛出异常。成功执行最终会创建一个对象,该对象根据构造函数中设置的状态表现出特定的行为。无论哪种方式,都需要测试。但构造函数测试很无聊,因为它们看起来都一样——调用构造函数,做出断言。测试方法声明通常比整个测试逻辑占用更多空间...因此我编写了一个简单的测试库,它有助于为构造函数编写声明性测试: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)
通过这种方式,我可以测试构造函数的所有相关案例,而无需输入太多内容。