假设我有一个依赖于其他 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/