c++ - 使用 C++ 进行测试驱动开发 : How to test a class which depends on other classes?

标签 c++ tdd

假设我有一个依赖于其他 3 个类 X、Y 和 Z 的类 A,要么 A 通过引用或指针使用它们,要么说 A 被模板化为用 X、Y 和 Z 实例化都没有关系,关键是为了测试 A,我需要有 X、Y 和 Z。

所以我需要 A、B 和 C 的假货。假设我写了它们。现在,我如何轻松交换真假对象?我可以看到这在模板的情况下很容易工作。为了在 A 通过引用或指针依赖 X、Y 和 Z 时使其正常工作,我需要有一个基类 X_Interface,我可以从中继承 X_Real 和 X_Fake。

所以基本上,我最终会得到 3 倍于每个类的类数,这将需要一个假的。

我很可能遗漏了什么。必须有一种更简单的方法来做到这一点。拥有基类 X_Interface 也非常昂贵,因为我将使用更多空间并进行虚拟调用。我想我可以使用 CRTP,因为我知道它在编译时是 X_Real 还是 X_Fake,但仍然必须有更好的方法。

最佳答案

首先确保你所依赖的对象(X,Y&Z)在构造函数中传入,这样你可以在测试时轻松传入“假货”。 (我真的希望你使用的是单元测试框架,比如 CUnit)

现在,当您编写测试时,您需要做的就是为被测类所依赖的对象“伪造”。通常你可以只传入 'null',但如果你真的需要用那个 'fake' 做一些事情,你可以简单地实例化它(你确保它的所有依赖项也在构造函数中传递,对吧?对吧!)。

或者在极端情况下,您可能会扩展所依赖的类并重新实现一些关键方法以适合您的测试。

因此现在在大多数情况下您不需要“假”,有时您只需实例化一个真正的“假”,在极少数情况下您有一个仅驻留在测试代码中的额外类。

Look at this video for a much better explanation.

GoogleTechTalks 中有更多关于此主题的内容,但您可以从此处进行管理。

关于c++ - 使用 C++ 进行测试驱动开发 : How to test a class which depends on other classes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2406372/

相关文章:

c++ - boost::lambda::var 嵌套在 boost::bind 中不等同于 boost::lambda::var 本身

c# - 起订接口(interface)

c++ - 使用 Crypto++ 解码十六进制编码值

c++ - 使用 C++ 模板实现 Haskell 的 `map` 函数的问题

c# - 从另一个方法内部调用的方法的单元测试返回值

ruby-on-rails - watchr 与 rails 应用程序的自动测试

c# - Moq - 如何验证属性值是否通过 setter 设置

c# - TDD 红绿灯的重构阶段 - 如何做到这一点?

用于 3D 监视器显示的 C++ 库

c++ - Eclipse CDT 构建输出解析器以与 Microsoft 编译器 (cl.exe) 配合使用