2011-06-24 92 views
3

爲什麼這種測試方法不起作用?我不斷收到需要返回值或拋出的異常。Rhino Mocks存根方法不起作用

public AuthenticateResponse Authenticate(string username, string password) 
     { 
      string response = GetResponse(GetUrl(username, password).ToString()); 

      return ParseResponse(response); 
     } 


     [TestMethod()] 
     [ExpectedException(typeof(XmlException))] 
     public void Authenticate_BadXml_ReturnException() 
     { 
      MockRepository mockRepository = new MockRepository(); 
      SSO sso = mockRepository.Stub<SSO>(); 

      sso.Stub(t => t.GetResponse("")).Return("<test>d"); 

      AuthenticateResponse response = sso.Authenticate("test", "test"); 
     } 
+0

GetResponse方法是虛擬的嗎? –

+0

是的,它是虛擬的 –

回答

3

您的存儲庫仍處於「記錄」模式。您將記錄/重放語義(「舊」的做事方式)與新的AAA(排列/行爲/斷言)風格混合在一起。

而是創建自己的資源庫,只需使用:

var sso = MockRepository.GeneateStub<SSO>(); 

一切都應該可以正常工作了。

+0

修復了這個錯誤,但現在它不是觸及Parse方法,而是模擬GetResponse方法。我添加了上面的實際方法。它重寫Parse方法嗎? –

+0

我的代碼中沒有看到任何「Parse」方法。 – PatrickSteele

+0

return ParseResponse(response); –

1

你的最後一行是調用存根對象上Authenticate方法,您沒有設置退貨或值或異常調用它時拋出,所以犀牛嘲笑不知道存根應該做什麼並導致錯誤。你可能不想在你的存根上調用一個方法 - 這對我來說似乎毫無意義,是否有另一個對象(你在這個測試中實際測試過)應該調用一個方法?

+0

我想我錯了。身份驗證方法會調用外部服務並獲取數據。我想用 d來模仿它,並將它發送給也在驗證中的Parse方法。 –

0

這是你的全部測試嗎?如果是這樣,你的測試是沒有意義的。測試中唯一的對象是你正在測試的對象 - 測試的主題在哪裏?

如果您嘗試測試SSO類,那麼您的絕對不會是想要模擬/存根。如果SSO具有一個或多個依賴關係,則使用模擬框架來設置這些依賴關係與SUT之間的固定交互。這是模擬框架的確切目的。

+0

我想我應該直接測試解析方法,而不是驗證方法本身。我的依賴是我試圖刪除的HTTP請求。 –