2011-01-05 9 views
1

Bへの呼び出しが後でAへのコールバックを開始するクラスBとインタフェースするC++クラスAをテストする必要がある場合は、どのようなデザインパターンが良いでしょうか?
私はこれらのコールバックが実行され、どの情報で制御されるかを完全に制御する必要があります。C++コールバック付きの偽のクラス

私はGoogle TestGoogle Mockをテストフレームワークとして使用しています。 Google Mockのイントロでは、difference between a fake and a mockについて説明します。私は偽のBクラスを必要とし、モックではないようです。そのドキュメントnon-trivial implementations of B's functionsを持っているそれらがどのように詳細に
が、これはBからAへ

UPDATESコールバックを制御するための私の要件で解決していない:

  • だけ明確にする:Aはコールバックを持っています。 AがBの関数を呼び出した後のある時点で、BはAのコールバック関数を開始します。私の場合、BはAへのポインタを保持し、(あらかじめ定義された仮想クラスA_abstractから派生した)

答えて

2

class AコールバックコールがBによって、またはいくつかの完全に異なるコードで作られていた場合に心配すべきではない、などB.でメンバー変数としてA_abstractポインタを持っている限りにBからのコールバックを達成することができますコールバックで提供されるすべての情報が正しい限り、

これは、テストケースがコールバックに必要なすべての情報を取得できれば、適切な時間にテストスクリプト内からコールバックを呼び出して、class Bのモックを使用できることを意味します。


class Aが実際にコールバックが(これまでに実際に実現することができるという点で)class Bによって行われていることを確認した場合は、その後、クラスABは、それらを個別にテストするためにあまりにも緊密に結合されています。そして、本当に2つの強固に結合したクラスでなければならないと思います。

+0

あなたは最初の半分が解決策であるように思われますが、まだテストする必要があります。何らかの理由で私はBがAを引き起こさなければならないという考えに縛られていました。私の場合少なくともBやテストスクリプトがAのコールバックを呼び出すかどうかは関係ありません。 – Jonathan

+0

それは常にそうであるべきである方法です。テスト中のコードが気付かないか、またはその違いを気にしない限り、モックは実際のコードを再解析する必要はないことを覚えておいてください。 –

0

あなたの質問をよく理解しているかどうかわかりませんが、希望するものはthe strategy patternと思われます。あなたは

class A_abstract { 

public: 
    virtual void work() = 0; 
}; 

class B { 

private: 
    A_abstract* _m_A_ptr; 

public: 
    set_a_ptr(A_abstract* _APtr) { _m_A_ptr = _APtr; } 

    void work() { _m_A_ptr->work(); } 
}; 
0

あなたはQt(または他人の)信号とスロットを使用することを検討しましたか?私はシグナルとスロットについてコールバックよりも多くのことを推論するのが好きですが、基本的に機能は同等です(私は思うが)。

-Brian-

+0

コールバックに問題はありませんが、QTの信号とスロットは機能が異なります。彼らはPublisher/Subscriberパターンに非常に似ていますが、QTがコールバックを登録する方法が悪いので少し悪いです。 –

関連する問題