我正在尝试对用 C++ 编写的 HTTP API 进行单元测试:
void getLogNames(Request & req, Response & res)
{
vector<string> files = getFilesInDirectory(LOG_LOCATION, ".log", false);
json response(files);
res.send(response);
}
问题是 LOG_LOCATION
包含在 common.h
中并且是 const
,并且无法通过我的测试代码更改:
const std::string LOG_LOCATION = "/var/log"
我试过在文件顶部这样做:
#ifdef UNIT_TEST
#include <common_mock.h>
#else
#include <common.h>
#endif
但是,common.h
包含在一些正在链接的共享库中,我必须向所有这些文件添加 UNIT_TEST
Hook 并重建共享库还有图书馆,我宁愿避免...
有没有更简单的方法可以做到这一点,一些 #define
技巧之类的?
最佳答案
好吧,您可以尝试 const_cast 一个指向您的 LOG_LOCATION 的指针,但它是肮脏且不可靠的解决方案,并且可能会导致段错误。例如:
original_file.h
#include <iostream>
const std::string LOG_LOCATION = "/var/log";
int func() {
std::cout << LOG_LOCATION << std::endl;
}
unit_test.cpp
#include "test.h"
void someUnitTest() {
const std::string* cs = &LOG_LOCATION;
std::string* s = const_cast<std::string*>(cs);
*s = "NEW_VALUE";
std::cout << *s;
}
int main() {
someUnitTest();
}
此代码在某些情况下可能有效(即此代码在 GCC 中成功编译和工作,但仅适用于类对象类型 - 它会因 int 等内置类型而崩溃)但可能会随着不同的编译器、平台或优化级别而改变。
推荐的方法是重新设计您的应用程序并使用依赖注入(inject),例如将您的函数调用包装在一个类中并将此位置作为可设置的成员。
关于c++ - 模拟 const 值以进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46373786/