看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《pracinverse (改)》之銘言: : 最近在看單元測試, : 看到反轉控制容器(Inversion of Control (IoC) Container)這個東西, : 看的不是很懂,也不知道他是怎麼運作的, : 想要自己實作一個來研究看看,不過網路上的範例都是C#或Java居多, : 對這些語言又比較不熟 : 好不容易找到一個用C++實作的範例如下: : class Resolver : { : static map<string, void* > typeInstanceMap; : public: : template<class T> static void Register(const T& object) : { : typeInstanceMap[typeid(T).name()] = (void*)&object; : } : template<class T> static T& Resolve() : { : return *((T*)typeInstanceMap[typeid(T).name()]); : } : }; : 卻不知道要怎麼樣應用在單元測試上, : 有請高手指點, : 謝謝~ 用這個程式碼 Google 一下 猜想你是從這上面看到的 http://www.codinginlondon.com/2009/05/cheap-ioc-in-native-c.html 他已經有一些解釋了 以他的範例大致上就是說 如果 BusinessStuff 裡面會用到 DataLayer 如果你把 dependency 寫死了 那在單元測試的時候就會很麻煩 而 inversion of control 的意思就在於 把這層 dependency 的關係拉出來給外界控制 這裡的 BusinessStuff 只認識 IDataLayer 介面 究竟 IDataLayer 是結合到真正的 DataLayer 還是 FakeDataLayer 呢 ? 這個可以用 Resolver 來決定 你提供的程式碼裡的 Register(const T&) 就是拿來決定結合到那個 object 而 Resolve() 就是 BusinessStuff 在使用 IDataLayer 時取出所結合的 object 當單元測試時, 我們可以將其抽換為結合 FakeDataLayer 而這個 FakeDataLayer 的實作可以不用真的連接資料源 也許可以用來計算各個介面函式呼叫的次數, 順序等供測試時使用的資料 如此就能達到單元測試的目的 然後 inversion of control container 就是存這些結合關係的容器 希望這樣講解能幫助搞懂 ※ 編輯: ledia 來自: 140.112.30.33 (02/20 22:56) ※ 編輯: ledia 來自: 140.112.30.33 (02/20 23:12)