gpt4 book ai didi

c++ - 如何使用 CMake 隐藏头文件以进行单元测试

转载 作者:太空宇宙 更新时间:2023-11-04 13:03:18 25 4
gpt4 key购买 nike

这是我的简化文件夹结构:

+ 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)

所以对于测试用例,我希望 tests/DragonHeader.h 隐藏 production/DragonHeader.h。 => ClassToTest.cpp 包括测试/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 复制到测试文件夹中,但我认为它不是最优的。

最佳答案

我的第一个想法是对生产和单元测试使用不同的 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 添加到编译器标志。

第三种解决方案是在 make 之前用 test/DragonHeader.h 的拷贝替换 production/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

关于c++ - 如何使用 CMake 隐藏头文件以进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43364475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com