模拟测试的const值

Mocking const values for testing

本文关键字:const 测试 模拟      更新时间:2023-10-16

我正在尝试单位测试用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.hconst,无法通过我的测试代码更改:

const std::string LOG_LOCATION = "/var/log"

我尝试在文件的顶部执行此操作:

#ifdef UNIT_TEST
#include <common_mock.h>
#else
#include <common.h>
#endif

但是, common.h包含在某些正在链接的共享库中,我必须在所有这些文件中添加 UNIT_TEST挂钩并重建共享库,我宁愿避免...

我可以这样做的更简单的方法,一些#define技巧或其他方法吗?

好吧,您可以尝试const_ cast_ casto fo log_location,但这是肮脏且不可靠的解决方案,可能会导致SEG故障。例如:

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中成功编译并起作用,但仅适用于类对象类型 - 它使用buildin Type(例如INT)崩溃),但IS可能会随着不同的编译器,平台或优化级别而更改。p> 推荐的方式是重新设计您的应用程序并使用依赖注入,例如,将功能调用包装在类中,并将此位置作为可设置的成员。

为什么不更改类以在其构造函数中接收日志位置?通过对其进行硬编码(宏是从测试的角度来进行硬编码),您故意使您的课程不可测试。