在 tdd 的實踐中,總是要考慮類的依賴項的透明性(transparent)和不透明性(opaque),進而採用合理的方式提高**的可測試性。
我們先看段前置條件**,以供後文使用。
1現在,我們需要乙個負責管理 user 的類 usermanager,其實現了介面 iusermanager。public
inte***ce
iuserprovider25
6public
class
userprovider : iuserprovider7,
17};18}
19}2021
public
class
user
2224
public datetime lastactivity
25 }
1通過 usermanager 內定義的 函式 numberofusersactiveinlast10days 我們可以得到過去 10 天內活躍的使用者數量。public
inte***ce
iusermanager25
6public
class
usermanager : iusermanager719
return
result;20}
21 }
1在函式 numberofusersactiveinlast10days 中,我們從 servicelocator 中獲取了乙個 iuserprovider 的實現,然後通過其獲取所有 user。再根據給定條件過濾使用者,返回過去 10 天內的活躍使用者數量。class
program
217 }
在 usermanager 的使用中,我們並不知道其依賴於 servicelocator 和 userprovider 等類。
這種將 ioc 呼叫直接嵌入到**實現中的隱式使用方式稱之為不透明依賴注入。
現在我們來為 numberofusersactiveinlast10days 編寫單元測試**。
第乙個用例為驗證在資料庫中不存在使用者名稱以給定字串開頭的使用者。
如果我不知道 numberofusersactiveinlast10days 的內部實現,採用黑盒測試的方式,我會寫出如下**。
1則執行測試用例後,得到的結果是:[testmethod]
2public
void
getactiveusers_testcaseofzerousers_wouldreturnemptycollection()
3
"未將物件引用設定到物件的例項。"
此時,我們知道了 numberofusersactiveinlast10days 函式還要依賴 servicelocator 和 userprovider 類。
現在,我們來改進測試**。
1則現在我們可以通過此測試了。[testmethod]
2public
void
getactiveusers_testcaseofzerousers_wouldreturnemptycollection()
3
可以看到,在**中使用不透明依賴將導致為**編寫單元測試變得困難和不可**。
現在我來將依賴項重構為透明依賴,通過建構函式將依賴注入。
1**的使用也需稍作修改。public
class
usermanager : iusermanager29
10public
int numberofusersactiveinlast10days(string
username)
1120
return
result;21}
22 }
1 usermanager usermanager = new usermanager(container.resolve());這種可以明確的通過建構函式顯式的注入的依賴項稱之為透明依賴。2int activeusercount = usermanager.numberofusersactiveinlast10days("
hello");
3 console.writeline(activeusercount);
改進測試**,直接去掉了對 servicelocator 的依賴。
1這一次執行順利的通過。[testmethod]
2public
void
getactiveusers_testcaseofzerousers_wouldreturnemptycollection()
3
通過使用透明依賴方式,可以極大的簡化測試編寫過程,並且可以引導更簡潔的設計。同時,配合 ioc 容器的合理使用將極大的發揮依賴注入的能力。
opacity 不透明度
opacity 不透明度 初始值 1 不透明 繼承性 是 css3提出opacity屬性 div目前較老的firefox版本,我們需要使用 moz 字首,而對於舊的safari chrome版本,我們需要使用 webkit 字首。而對於更老的還在使用khtml核心而不是webkit核心的safari...
如何實現容器透明,內容不透明?
3.透明度問題 opacity 在ie中透明度不顯示,當我們向父元素中新增子元素的時候,就會發現子元素繼承了父元素的透明度。而在某些情況下這是我們不希望發生的。即使你重新設定子元素的透明度為不透明,它仍然會繼承父元素的透明度。要怎樣解決這個問題呢?我們可以使用絕對定位來使這些元素看起來像父子關係。你...
不透明度和DHTML
理查德 拉特 richard rutter 的 不帶flash漸隱 的onload影象漸隱演示了一種使用css不透明度屬性的動態更改為 建立 淡入 效果的方法。不透明度不是css 2.1規範的一部分 儘管css 3涵蓋了它 因此不同的瀏覽器具有不同的控制方式。richard的setopacity 函...