Websocket サーバーで CRTP 静的ポリモーフィズムを使用して、ネットワーク コードをビジネス ロジックから分離します。基本クラスはメッセージを処理するために派生のメソッドを呼び出し、次に派生は送受信のために基本を呼び出します。それは魅力のように機能し、次のようになります。
template<typename Derived>
class WebsocketSessionBase {
// basic websocket send/receive stuff
void someBaseMethod() {
static_cast<Derived*>(this)->otherDerivedMethod();
}
};
class WebsocketSession : public WebsocketSessionBase<WebsocketSession> {
// specific business logic
void someDerivedMethod() {
otherBaseMethod();
}
};
今度は単体テストです。コードが分離されているため、クラスのテスト機能を個別に使用したいと考えています。
基本クラスのテストは簡単です。
class TestSession : public WebsocketSessionBase<TestSession> {
// same interface as WebsocketSession, but test code, cool!
};
しかし、派生クラスをテストするにはどうすればよいでしょうか? Base テンプレート パラメーターを追加すると、テスト コードが問題なく作成されます (Base はモック クラスです)。しかし、製品版では 2 つのテンプレート クラスが相互に参照することになります... :(
template<typename Base>
class TestableWebsocketSession : public Base {
};
using TestedWebsocketSession = TestableWebsocketSession<MockBase>;
using ProdWebSocketSession = TestableWebsocketSession<WebsocketSessionBase<... // infinite loop - now what!?
これを乗り越えることは可能ですか?