私は、簡略化されたバージョンが次のようなクラスに取り組んでいます:
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
)。
私の見方では、3 つのオプションがあります。
- 公開
extract_content_type
する extract_content_type
ユーティリティ クラスまたは名前空間に抽出する- それらをオーバーライドするモック オブジェクトを作成して仮想化して作成
start_server
するget_request
何かを公開したり、単一のクラスで一度だけ使用されるユーティリティ名前空間に移動したりしたくないので、最も害が少ないのはオプション 3 です。
V8コードベースでこれの例を少なくとも1つ見ました: http://code.google.com/p/v8/source/browse/trunk/test/cctest/test-date.cc
それでも、それが良い考えかどうかはわかりません。virtual
次の 2 つの理由から、C++ のデフォルトではありません。
- それはパフォーマンス/メモリのオーバーヘッドを誘発します(おそらく私の場合は問題になりません)
- すべてのクラスが基本クラスとして使用されることになっているわけではなく、明示的にすることも設計上の決定でした
あなたならどうしますか?役に立たない仮想と一緒に暮らす?それとも、関数をまったくテストしないのですか? 私は TDD には興味がありませんし、なりたいとも思っていませんがextract_content_type
、テストに対するような関数を開発する方が簡単です。