我正在编写一个类,其简化版本如下:
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
)。在我看来,我有三个选择:
1. 将
extract_content_type
公开。
2. 将extract_content_type
提取到一个实用类或名称空间中。
3. 使start_server
和get_request
虚拟,并创建一个覆盖它们的模拟对象。我不想公开任何东西或移动到仅在单个类中使用一次的实用名称空间,因此最小的恶是选项3。
我至少在V8代码库中看到了一个这样的例子: http://code.google.com/p/v8/source/browse/trunk/test/cctest/test-date.cc 然而,我不确定这是否是一个好主意。
virtual
不是C++的默认值,原因有两个:1. 它会导致性能/内存开销(尽管在我的情况下可能不重要)。 2. 并非每个类都应该用作基类,这也是一个设计决策。
你会怎么做?接受无用的虚拟函数?还是干脆不测试这个函数?我不喜欢TDD,也不想成为一个TDD信徒,但对于像
extract_content_type
这样的函数进行测试更容易一些。