2015-03-31 83 views
2

我想使用模板依賴注入來測試使用C系統調用來操作文件描述符的C++類。理念是有一個抽象類和一個實例來包裝像read(),write()等系統調用。然後我用模擬來測試我的目標類。 抽象類和系統調用是這樣的:(我將省略參數予以明確)C++依賴注入來測試類系統調用的類

class OSCall{ 
    read()=0; 
    write()=0 
}; 
class DefaultOSCall : public OSCall{ 
    read(){...} 
    write(){...} 
} 

後來我注入OSCall在課堂上,我想使用它:

template<typename OSCall> 
class FD{ 
    public: 
     OSCall osCall_; 
     OSCall &GetOSCall(){return osCall_;} 

     read(){osCall_.read()} 
     write(){osCall_.write()} 
} 

現在如果我想用模擬來測試我的FD類,我只需要在模板參數中傳遞我的模擬,並使用GetOsCall獲取模擬實例。

比方說,我想用FD作爲另一個類的成員:

template<typename OSCall> 
class User{ 
    public: 
     DoSomething(){fd_.read();.......} 
     OSCall &GetMemberOSCall(){return fd_.GetOSCall()} 
    private: 
     FD<OSCall> fd_; 
} 

如果我想用一個模擬測試用戶,我可以使用GetMemberOSCall的OSCall情況下,它的工作原理,但它是做到這一點的最佳方法之一?最後,我想向類成員注入一個模擬,並期望成員模擬的返回值。我希望我明確自己。

感謝

回答

0

我建議你重命名GetMemberOSCall()剛剛getOSCall()

這似乎可以使它與模板類需要實現getOSCall()方法的通用模板結合使用,並且您可以使用FD<OScall>User<OScall>實例化此模板。似乎是一個更靈活的方法。

+0

我想我明白了你的觀點,然而,我想到另一個問題。假設我想要使用OSCall包裝的成員: '模板 class用戶{ ...... 私有: FD fd_; 其他類 other_; }' 在這種情況下,爲了能夠模擬oscall返回類型,我需要從FD和OtherClass訪問OSCall實例。快速反應將不得不方法來獲得這兩個實例。這聽起來不錯嗎? – rell 2015-04-01 14:46:51

+0

對我來說聽起來像OSCall應該是一個std :: shared_ptr或類似的東西,這樣所有類方法只會共享一個OSCall實例;然後它就無所謂了。或者,使用繼承而不是類成員,並使用虛擬OSCall基類。 – 2015-04-02 00:51:17

+0

大多數用於注入的framworks使用infact shared_ptr – GameDeveloper 2015-04-02 10:52:30