【发布时间】:2012-09-18 20:30:45
【问题描述】:
我正在编写一个简化版如下所示的课程:
class Http_server {
public:
void start(int port)
{
start_server();
std::string content_type = extract_content_type(get_request());
}
private:
void start_server()
{
...
}
std::string get_request()
{
...
}
std::string extract_content_type(const std::string& request) const
{
...
}
};
现在我想为extract_content_type 写一个测试用例。问题是:它是私人的,所以我不能从外面调用它。我可以测试的唯一函数是start,但实际上它会启动服务器 (start_server) 并等待请求 (get_request)。
我怎么看,我有三个选择:
- 公开
extract_content_type - 将
extract_content_type提取到实用程序类或命名空间中 - 将
start_server和get_request设为虚拟并创建一个模拟对象来覆盖它们
我不想公开任何内容或移动到仅在单个类中使用过一次的实用程序命名空间,因此最不邪恶的是选项 3。
我在 V8 代码库中至少看到过一个这样的例子: http://code.google.com/p/v8/source/browse/trunk/test/cctest/test-date.cc
不过,我不确定这是否是个好主意。 virtual 不是 C++ 中的默认值,原因有两个:
- 这会导致性能/内存开销(但在我的情况下可能无关紧要)
- 并非每个类都应该用作基类,使其明确也是设计决策
你会怎么做?与无用的虚拟生活在一起?还是根本不测试功能?我不喜欢 TDD,也不想这样做,但开发像 extract_content_type 这样的函数来测试会更容易。
【问题讨论】:
-
我会说选项 2 是最不邪恶的。使用 virtual,您的方法可以在派生类中公开公开。
-
同样。与#2。如果需要,您可以让您的测试用例使用模板 或类似的东西来包裹您的类,并在条件编译下将特定模板声明为朋友,但这有点复杂。选择简单。
标签: c++ unit-testing mocking virtual