c++ - 模拟 const 值以进行测试

标签 c++ c++11

我正在尝试对用 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/

相关文章:

C++ 将指针传递给带有引用参数的函数

c++ - 是否可以根据分配对象的类型特征覆盖全局 new 运算符?

c++ - NULL 不匹配模板参数?

c++ - 变量类派生自某个抽象类的类模板

c++ - static_assert 中的 std::pow 触发错误 C2057?

C++ 卡在切换我的游戏区域

c++ - 从对象外部操作链表

c++ - OpenGL 链式平移/旋转

c++ - 理解函数指针

c++ - 为枚举索引数组重载 std::get