2011-07-12 47 views
0

我有一個測試創建服務的單元測試(使用typemock 5.4.5.0)。創建服務在其構造函數中傳遞到驗證服務中。驗證服務返回一個具有布爾屬性(IsValid)的對象。在我的單元測試中,我嘲笑驗證服務調用以返回IsValid設置爲true的實例。創建服務有一個if語句來檢查該屬性的值。當我運行單元測試時,從驗證服務返回的對象的屬性設置爲true,但是當執行if語句時,它將它視爲假。被設置爲true的模擬對象被當作假對待

我可以通過調試單元測試來驗證這一點。驗證服務返回的對象確實將其IsValid屬性設置爲true,但它完全跳過了我的if語句的主體並轉到End If。

下面是單元測試本身的鏈接 - https://gist.github.com/1076372

這裏是一個鏈接到創建服務功能我測試 - https://gist.github.com/1076376

有誰知道爲什麼地獄IsValid屬性是真實的,但對待它是錯誤的?

P.S.我還在TypeMock的支持系統中輸入了這個問題,但我想我可能會在這裏得到更快的響應!

回答

0

首先,如果可能,我建議升級到您獲得授權的最新版本的Typemock Isolator。每個出版的版本,甚至是次要版本,都包含修復有趣的邊緣案例,有時會使事情工作不同。我發現升級有時可以修復事情。

接下來,我看到你的單元測試這一行:

Isolate.WhenCalled(() => validator.ValidateNewQuestionForExistingQuestionPool(new QuestionViewModel())).WillReturn(new Validation(true)); 

紅旗對我來說是「新QuestionViewModel()」這就是「WhenCalled()」塊中。拇指

兩個很好的規則,我公司始終遵循:

  1. 不要放任何東西,你不想嘲笑WhenCalled()。
  2. 如果你不關心參數,請不要傳遞真實的參數。

在這種情況下,第一條規則讓我覺得「我不希望QuestionViewModel的構造函數被嘲笑,所以我不應該把它放在那裏。」

第二條規則讓我考慮「ValidateNewQuestionForExistingPool」方法的參數是否真的不重要。在這種情況下,它不是,所以我會傳遞null而不是真正的對象。如果您正在專門查看超負荷,請首先投射null。

最後,根據第一條規則,我通常不嘗試內聯我的返回值。這意味着我會在Isolate調用之前創建新的Validation對象。

var validation = new Validator(true); 
Isolate.WhenCalled(() => validator.ValidateNewQuestionForExistingQuestionPool(null)).WillReturn(validation); 

試試看,它是如何運行的。您也可以在Typemock Tracer實用程序中查看當您運行測試以確保未設置額外的期望值時您設置的期望值。期待

相關問題