这是我的简化文件夹结构:
+ production
+-- ClassToTest.cpp (contains '#includes "DragonHeader.h"')
+-- ClassToTest.h
+-- DragonHeader.h (has a lot of dependencies, ClassToTest only need one simple static function with no dependencies at all.)
+ tests
+-- tst_ClassToTest.cpp
+-- DragonHeader.h (which defines and implements the needed simple function)
因此,对于测试用例,我喜欢测试/ DragonHeader.h阴影制作/ DragonHeader.h。 => ClassToTest.cpp包含tests / DragonHeader.h。怎么能实现呢? (如果相关,我正在与MSVC 2015合作......)
tests文件夹中的CMakeLists.txt看起来像
project( tst_ClassToTest )
set( ${PROJECT_NAME}_SOURCES tst_ClassToTest.cpp DragonHeader.h ../production/ClassToTest.cpp )
# How to force ClassToTest.cpp to use DragonHeader.h, not production/DragonHeader.h?
add_executable( ${PROJECT_NAME} WIN32 ${${PROJECT_NAME}_SOURCES} )
谢谢!
免责声明:我寻求的解决方案不需要我触及ClassToTest.cpp或触摸生产中的代码,包括相关的CMakeLists.txt文件。但是,一种解决方案是使用CMake将ClassToTest.cpp / h复制到tests文件夹中,但我认为它不是最佳的。
答案 0 :(得分:0)
我的第一个想法是对生产和单元测试使用不同的include_directory
语句。但在这种情况下,其他头文件ClassToTest.h
必须位于不同的文件夹中。或者您必须将DragonHeader.h
移动到另一个文件夹中。
# CMake for production
include_directory(production)
include_directory(production_dragon)
#CMake for test
include_directory(production)
include_directory(test_dragon)
另一种方式可能是
#ifndef USE_TEST_HEADERS
#include "DragonHeaderTest.h"
#else
#include "DragonHeader.h"
#endif
ClassToTest.cpp
中的。要将定义添加到test/CMakeLists.txt
文件中,请将字符串-DUSE_TEST_HEADERS
设置为编译器标志。
第三种解决方案是将production/DragonHeader.h
替换为先进的test/DragonHeader.h
副本。这仅适用于production/DragonHeader.h
可以恢复的情况。来自文件系统副本或来自配置管理。系统。这可以通过将bild包装成脚本来实现。不知道MSVC 2015是否可以触发这样的脚本而不是构建。
rem Build for tests
rem Run cmake
cmake PARAMETERS
rem Prepare unit test
cp WHATEVER
rem nmake
name PARAMETERS