【針對遺留代碼加入單元測試的藝術】201910 第七梯次﹣台北

【課程涵蓋範圍包含下列主題】

辨識依賴、隔絕依賴、依賴注入、擷取與覆寫、stub/mock 差異與使用場景、單元測試三種驗證方式、相依靜態方法的單元測試、父類依賴的測試、委派與事件的測試、測試程式重構與設計

報名這裡去➟【201910 針對遺留代碼加入單元測試的藝術 報名表單

...繼續閱讀 »

Write a Unit Test for ExceptionFilterAttribute

在 ASP.NET MVC 與 ASP.NET Web API 中,會使用有彈性且關注點分離的 ActionFilter 來進行進出 Action 的控制。

然而 ActionFilter 大部分都是在處理 HttpRequest 與 HttpResponse 的內容,該怎麼為 ActionFilter 撰寫獨立的單元測試呢?這篇文章將以一個簡單的自訂 ExceptionFilter 來當範例,說明怎麼模擬 HttpRequest HttpResponse,尤其是使用了 HttpRequestMessage CreateResponse() 系列方法。

...繼續閱讀 »

【單元測試】如何測試 AOP 中的 interceptor

當在設計中引入 AOP 的設計時,就會出現幾個用來處理橫切面的攔截器(Interceptor),然而這些攔截器就如同 ASP.NET Web API 中的 message handler 或是 ASP.NET MVC 中的 Action Filter 一般,實際使用的 context 是成為寄托於某個類別或 interface 上的 wrapper。

因為極度地抽象化之後,要獨立測試攔截器變得沒那麼單純,這篇文章將帶著大家避開複雜的 DI container 註冊,也能簡單地對攔截器撰寫單元測試。

這一點非常重要,如果你連攔截器的設計,也想要 TDD 開發的話,你就得先擬出怎麼簡單使用你所設計攔截器物件的情境。

...繼續閱讀 »

單元測試實戰操練營 201901 第五梯次﹣台北 (額滿)

【課程涵蓋範圍包含下列主題】

辨識依賴、隔絕依賴、依賴注入、擷取與覆寫、stub/mock 差異與使用場景、單元測試三種驗證方式、相依靜態方法的單元測試、父類依賴的測試、委派與事件的測試、測試程式重構與設計

報名這裡去➟【201901 單元測試實戰營 報名表單

...繼續閱讀 »

[遛書]《單元測試的藝術》測試可行性表

面對 legacy 產品,在時間資源有限的情況下,該挑哪些功能來進行測試才適合,是實務上最重要的一件事。

在《單元測試的藝術》第十章的 [表 10-1] 依據組件類型來舉例,針對邏輯複雜度、依賴數量、在專案中的優先級幾個維度來分析,本文則針對這幾個維度進行補充說明。

...繼續閱讀 »

[Unit Test Tricks]Extract and Override Protected Function with Moq

之前介紹了 Extract and Override 的技巧,使得不需改變 production code 對外的 API,也仍然可以在測試專案中建立一個 SUT 的替身,覆寫想要 isolated 的 dependency 就可以針對 SUT 做 isolated unit test 。

但手刻 SUT 的替身總是不如 mock framework 看起來便利,這篇文章要介紹使用 moq 來節省手刻 SUT 替身的 effort, 直接透過 moq 來 stub SUT protected virtual 的方法。

...繼續閱讀 »

[Unit Test Tricks] Compare Object Equality

實務上撰寫的測試程式中,幾乎都需要針對 reference type 的物件或集合進行比對,然而大部分的 test framework 所提供的 Equals function 都是呼叫物件的 Equals(),也就是若沒有額外覆寫,仍然是比較 reference 的位址是否相等。

這篇文章介紹一個 Nuget 套件: ExpectedObjects,讓我們可以用簡單的 API 來針對物件、物件集合、組合式物件比較是否相等,還額外提供了部分比較的功能來因應實務上的需求。

...繼續閱讀 »

[Unit Test Tricks] Static Setter Injection

在實務開發中,常使用簡單工廠(Simple Factory)以及策略模式(Strategy Pattern)來封裝實作細節,使得 context 流程抽象穩定,並達到開放封閉原則(Open/Close Principle, OCP)中所蘊含可抽換實作的彈性。

在 context 流程中,透過簡單工廠依據條件來取得 interface 的 instance 固然美好,卻往往因為與簡單工廠的 static function 直接耦合,而導致這段 context 流程無法進行 isolated unit test。

這篇文章的小技巧,就是要解決 developer 因可測試性而廢棄簡單工廠不用,反而大費周章改用抽象工廠(Abstract Factory Pattern)的問題。

...繼續閱讀 »