2011-01-05 64 views
1

如果我需要測試一個C類A與B類接口,那麼B的調用稍後會啓動對A的回調,那麼這將會是一個好的設計模式?
我需要完全控制這些回調 - 當它們執行時以及使用哪些信息。C++帶回調的假類

我使用Google TestGoogle Mock作爲我的測試框架。在Google Mock的介紹中,他們解釋了difference between a fake and a mock。看來我需要一個假B類而不是模擬。
在他們的文檔,他們詳細介紹瞭如何有non-trivial implementations of B's functions,但這並沒有解決我的B控制回調的要求A.

更新:

  • 只是爲了澄清:一有回調。在A調用B的函數之後的一段時間,B在A中啓動回調函數。儘管無論如何,在我的情況下,B持有指向A的指針並調用預定義的接口函數(由純虛擬類A_abstract派生)。

回答

2

class A如果回調調用由B或一些完全不同的代碼所做的不應該擔心,因爲只要回調中提供的所有信息都是正確的。

這意味着,如果您的測試用例可以獲取回調所需的所有信息,那麼您可以在適當的時間從測試腳本中調用回調,並使用模擬class B


如果class A實際檢查該回調由class B執行(在到目前爲止,實際上可以實現),然後類AB耦合得太緊單獨測試它們。那麼你應該重新思考它們是否應該是兩個緊密耦合的類。

+0

你是上半年似乎是解決方案,我仍然需要測試它。出於某種原因,我被鎖定了B必須觸發A的想法。至少在我的情況下,如果B或測試腳本調用A的回調,那真的沒有關係。 – Jonathan 2011-01-07 08:06:25

+0

這就是它應該如此。只要記住,mock不必重複實際的代碼,只要被測代碼無法注意或不關心其差異即可。 – 2011-01-08 11:30:23

0

我不知道我是否理解你的問題,但似乎你想要的是the strategy pattern。你可以實現的B回調到一個只要你有一個A_abstract指針作爲成員變量B.

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的信號和插槽有不同的功能。它們與發佈者/訂閱者模式非常相似,但由於QT註冊回調的方式而變得更糟。 – 2011-01-06 06:52:41