模拟测试的const值
Mocking const values for testing
我正在尝试单位测试用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
挂钩并重建共享库,我宁愿避免...
我可以这样做的更简单的方法,一些#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> 推荐的方式是重新设计您的应用程序并使用依赖注入,例如,将功能调用包装在类中,并将此位置作为可设置的成员。
为什么不更改类以在其构造函数中接收日志位置?通过对其进行硬编码(宏是从测试的角度来进行硬编码),您故意使您的课程不可测试。