我使用template dependency injection来测试一个依赖于我无法改变的代码中的非虚方法的类。我想像以前一样maintain the class's declaration and definition separately。两种可能的模板实例在编译时都是已知的,这可能会减少膨胀/编译时间。如链接中所述,这可以通过在.cpp
文件末尾显式实例化已知模板变体来完成:
// "Foo.cpp"
#include "Foo.h"
// definition of Foo<T>::f() etc.
template class Foo<Bar>;
template class Foo<MockBar>;
但是,这会在生产代码中引入测试引用。此外,如果我尝试转发声明MockBar
我得到&#34;无效使用不完整类型&#34;错误。如果我从MockBar.h
添加Foo.cpp
,那么我需要确保我的构建过程也进行了调整,以包含并链接任何相关的测试代码Foo
(例如gmock),这似乎是错误的。如果我将template class Foo<MockBar>
实例化移动到Foo_test.cpp
,那么我会在其上获得未定义的引用链接错误(但是对于预期的实例化没有错误)。我想我对实例化过程缺少了一些东西。
如何在保留单独的标题方法的同时分离测试和生产代码?
答案 0 :(得分:1)
您可以以不同的方式拆分文件,并为您的测试提供实施访问权限,例如:
foo.h中
template <typename T> class Foo
{
// member declaration ...
};
Foo.inl
#include "Foo.h"
template <typename T>
void Foo::bar() { /*...*/ }
Foo.cpp中
#include "Foo.inl"
#include "Bar.h"
// Instantiations
template class Foo<Bar>;
// ...
在FooTest.cpp
#include "Foo.inl"
#include "MockBar.h"
template class Foo<MockBar>;
// Test Foo<MockBar> ...
所以普通用户只使用Foo.h 需要Foo定义(作为unittest)的用户包括Foo.inl Foo.inl可能是私人包含(不在“包”中提供)。