l

2014年10月6日 星期一

Test Double(5):Test Spy

Sep. 22 21:59~22:38

image

 

接續〈Test Double(3):Dummy Object〉所提到的系統設計,這一集要套用Test Spy。

Test Spy的題目

先回憶一下系統的類別圖。

螢幕截圖 2014-09-22 22.08.45

 

今天要練習的題目是「使用Spy實作IAlert,測試Server.monitor會呼叫IAlert.sendAlert函數」。先看一下Server的constructor與monitor原始碼。monitor會呼叫向它註冊的ICommand.execute函數,如果執行結果不是OK,則呼叫alert.sentAlert函數送出一個錯誤訊息。

螢幕截圖 2014-09-22 22.13.41

 

在〈Test Double(2):五種替身簡介〉Teddy提到Spy是用來測試SUT與DOC之間的行為互動,在這個例子中我們要測試monitor與alert之間的互動是否正確。我們先向Server註冊一個DoorCommand,然後測試當門打開的時候monitor會呼叫alert.sentAlert,反之則不會。以下是Teddy寫好的測試兩個案例,請鄉民們實作SpyAlert,讓下面兩個測試案例可以通過(下列程式中的SubOpenDoor物件與StubClosedDoor物件在〈Test Double(4):Test Stub〉已經實做過了)。

螢幕截圖 2014-09-22 22.21.41

 

實作Test Spy

實作SpyAlert的方法也簡單,在SpyAlert中宣告一個_sendAlert的布林變數,預設為false。當SpyAlert的sentAlert函數被呼叫之後,把_sendAlert設為true。最後,寫一個wasAlertSend函數來判斷sentAlert函數是否有被呼叫過。鄉民們有沒有注意到,sentAlert沒有真的送出任何訊息,只是記錄SUT曾經呼叫過它而已,也就是所謂的「測試SUT與DOC的互動」。

螢幕截圖 2014-09-22 22.29.54

 

實作完成Test Spy之後,執行剛剛的測試案例,兩個都通過了。

螢幕截圖 2014-09-22 22.33.00

***

友藏內心獨白:Stub與Spy的差別現在應該很清楚了。

沒有留言:

張貼留言