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情況下,它的工作原理,但它是做到這一點的最佳方法之一?最後,我想向類成員注入一個模擬,並期望成員模擬的返回值。我希望我明確自己。
感謝
我想我明白了你的觀點,然而,我想到另一個問題。假設我想要使用OSCall包裝的成員: '模板 class用戶{ ...... 私有: FD fd_; 其他類 other_; }' 在這種情況下,爲了能夠模擬oscall返回類型,我需要從FD和OtherClass訪問OSCall實例。快速反應將不得不方法來獲得這兩個實例。這聽起來不錯嗎? –
rell
2015-04-01 14:46:51
對我來說聽起來像OSCall應該是一個std :: shared_ptr或類似的東西,這樣所有類方法只會共享一個OSCall實例;然後它就無所謂了。或者,使用繼承而不是類成員,並使用虛擬OSCall基類。 – 2015-04-02 00:51:17
大多數用於注入的framworks使用infact shared_ptr – GameDeveloper 2015-04-02 10:52:30