处理构造函数仅用于测试的优雅方式

时间:2018-10-27 05:31:32

标签: c++ unit-testing constructor

我有一个被很多地方使用的基类:

class base {

  base(param1, param2 ...) // constructor 1, which is the legit constructor

  base(param3, param4 ...) // constructor only for unit testing!!!
  base(param5, param6 ...) // constructor only for unit testing!!!
}

是否有一种优雅的方式来处理这种情况?有一些构造函数仅用于测试确实令人困惑。我简化了上述情况,实际上我们有多个“真实”构造函数以及更多“假”构造函数。随着时间的流逝,人们开始使用伪造的构造函数,并且这种伪造的构造函数变得不可维护...实现此目标的更优雅的方法是什么?

2 个答案:

答案 0 :(得分:0)

伪造的构造函数做什么却不能在您的测试代码中完成?

通常希望通过公共api进行测试,因为这定义了要确保正确实现的一组行为。

当您要测试的代码依赖于其他复杂对象时,您仍然可以使用公共api,但是这些依赖关系被模拟掉了。

另请参阅:https://testing.googleblog.com/2013/03/testing-on-toilet-testing-state-vs.html

答案 1 :(得分:0)

第一步,避免意外使用更多的其他构造函数:您可以使仅供测试private使用的构造函数,并将测试类设为{{1} }。当然,这也可以用于替代异常的“测试构造函数”方法:例如,提供私有设置程序以允许更改对象状态以进行测试。

如果拥有更多构造函数的原因是为了简化测试设置:在测试中创建助手工厂函数可能会更优雅。这些将创建正确配置的friend实例。例如,您可以使用工厂功能,例如basemake_base_that_behaves_like_xxx。然后,工厂函数将理想情况下调用“合法”构造函数,并根据需要对对象执行其他修改。与使用多个专用构造函数的方法相比,这甚至可以导致更好的可读性解决方案。

请注意,引入特殊的构造函数有时可能对解决遗留代码的测试问题很有用,但不能像新创建的代码的设计模式那样有用:Feathers以 Parameterize Constructor的名称描述它 em>。