gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:59:43 25 4
gpt4 key购买 nike

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

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