Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用CMake对头文件进行阴影处理以进行单元测试_C++_Unit Testing_Cmake - Fatal编程技术网

C++ 如何使用CMake对头文件进行阴影处理以进行单元测试

C++ 如何使用CMake对头文件进行阴影处理以进行单元测试,c++,unit-testing,cmake,C++,Unit Testing,Cmake,这是我的简化文件夹结构: + 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_Clas

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

+ 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.h/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文件。然而,一个解决方案是使用CGORE将CLSASTest.cpp/h复制到测试文件夹中,但我认为它是次优的。p> 我的第一个想法是使用不同的
include\u目录
语句进行生产测试和单元测试。但是在这种情况下,另一个头文件
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
中。要设置define,请将字符串
-DUSE\u test\u HEADERS
添加到
test/CMakeLists.txt
文件中的编译器标志

第三种解决方案是在make的高级版本中将
production/dragoheader.h
替换为
test/dragoheader.h
。这仅在可以恢复
生产/DragonHeader.h
的情况下有效。从文件系统副本或从配置管理。系统。这可以通过将bild包装成脚本来实现。不知道MSVC 2015是否可以触发这样一个脚本而不是构建

rem Build for tests
rem Run cmake 
cmake PARAMETERS
rem Prepare unit test
cp WHATEVER
rem nmake
name PARAMETERS

我的第一个想法是使用不同的
include\u目录
语句进行生产和单元测试。但是在这种情况下,另一个头文件
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
中。要设置define,请将字符串
-DUSE\u test\u HEADERS
添加到
test/CMakeLists.txt
文件中的编译器标志

第三种解决方案是在make的高级版本中将
production/dragoheader.h
替换为
test/dragoheader.h
。这仅在可以恢复
生产/DragonHeader.h
的情况下有效。从文件系统副本或从配置管理。系统。这可以通过将bild包装成脚本来实现。不知道MSVC 2015是否可以触发这样一个脚本而不是构建

rem Build for tests
rem Run cmake 
cmake PARAMETERS
rem Prepare unit test
cp WHATEVER
rem nmake
name PARAMETERS

DragonHeader.h是否需要您不想在测试项目中重新指定的其他库?如果这是真的,请尝试将主项目变成一个库,其中包含一个链接它的小可执行文件。然后测试也可以链接库。CMake使这变得非常简单,因为可执行文件从库中获取了include目录等,所以您只需提及一次。这个问题对我来说也有点不清楚,您能补充一些您面临的问题的详细信息吗?我的问题的前提是,我不能接触“生产”中的任何文件我也不能改变整个构建过程(这是Joseph提出的)。我知道在这一点上它有点理论化,但这正是我所追求的:如何防止cpp文件在其自身旁边获取头文件。相比之下,我想在cpp文件中植入另一个头(名称相同,但位置不同)。在编写过程中,我意识到我想将cpp文件的inlcude目录顺序从“.tests”更改为“tests”。(请注意“.”)。问题是DragonHeader.h需要其他库,而您不想在测试项目中重新指定这些库吗?如果这是真的,请尝试将主项目变成一个库,其中包含一个链接它的小可执行文件。然后测试也可以链接库。CMake使这变得非常简单,因为可执行文件从库中获取了include目录等,所以您只需提及一次。这个问题对我来说也有点不清楚,您能补充一些您面临的问题的详细信息吗?我的问题的前提是,我不能接触“生产”中的任何文件我也不能改变整个构建过程(这是Joseph提出的)。我知道在这一点上它有点理论化,但这正是我所追求的:如何防止cpp文件在其自身旁边获取头文件。相比之下,我想在cpp文件中植入另一个头(名称相同,但位置不同)。在写作过程中,我意识到我想将cpp文件的inlcude目录顺序从“.tests”更改为“tests”。(注意“.”)。谢谢您的回答。我知道,这两种解决方案都可以很好地工作,但关键是我既不能更改ClassToTest.cpp,也不能更改任何现有的CMakeLists.txt。把它作为一个学术问题:如何防止C++预处理器/编译器在ClassToTest.cpp旁边取头,并说服编译器取/ A/Value/Out/Health.H.谢谢你的回答。我知道,这两种解决方案都可以很好地工作,但关键是我既不能更改ClassToTest.cpp,也不能更改任何现有的CMakeLists.txt。把它作为一个学术问题:如何防止C++预处理器/编译器在ClassToTest.cpp旁边取头,并说服编译器采取A/On/Obj/Obj/Head。