※ 引述《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)