2008-12-16 60 views
0

我正在嘗試使用Rhinomocks 3.5和新的lambda表示法來模擬一些測試。我讀過this,但還有很多問題。有沒有完整的例子,尤其是MVC類型的架構?Rhinomocks 3.5 for ...假如我

例如什麼是嘲笑這個最好的方法。

public void OnAuthenticateUnitAccount() 
    { 
     if(AuthenticateUnitAccount != null) 
     { 
      int accountID = int.Parse(_view.GetAccountID()); 
      int securityCode = int.Parse(_view.GetSecurityCode()); 
      AuthenticateUnitAccount(accountID, securityCode); 
     } 
    } 

有一個視圖界面和一個演示界面。它正在調用控制器上的事件。

我想出了這個。

[TestMethod()] 
    public void OnAuthenticateUnitAccountTest() 
    { 
     IAuthenticationView view = MockRepository.GenerateStub<IAuthenticationView>(); 
     IAuthenticationPresenter target = MockRepository.GenerateMock<IAuthenticationPresenter>(); 

     target.Raise(x => x.AuthenticateUnitAccount += null, view.GetPlayerID(), view.GetSecurityCode()); 
     target.VerifyAllExpectations(); 
    } 

它通過但我不知道它是否正確。

是的,我們正在開發之後進行測試......它需要快速完成。

回答

2

我假設這是你的控制器之一。此外,我假設您有一種方法可以通過構造函數或setter傳遞視圖數據,並且您有辦法註冊AuthenticateUnitAccount處理函數。鑑於這種情況,我會做類似如下:

[TestMethod] 
public void OnAuthenticateUnitAccountSuccessTest() 
{ 
    IAuthenticationView view = MockRepository.GenerateStub<IAuthenticationView>(); 
    view.Stub(v => GetPlayerID()).Returns(1); 
    view.Stub(v => GetSecurityCode()).Returns(2); 

    FakeAuthenticator authenticator = MockRepository.GenerateMock<FakeAuthenticator>(); 
    authenticator.Expect(a => a.Authenticate(1, 2)); 

    Controller controller = new Controller(view); 
    controller.AuthenticateUnitAccount += authenticator.Authenticate; 

    controller.OnAuthenicateAccount() 

    authenticator.VerifyAllExpectations(); 
} 

的FakeAuthenticator類包含處理程序的簽名相匹配的身份驗證方法。因爲你需要知道這個方法是否被調用,所以你需要嘲笑它而不是存根,以確保它是用適當的參數調用的等等。你會注意到我直接調用方法而不是引發一個事件。既然你只需要在這裏測試你的代碼,就不需要測試事件發生時會發生什麼。你可能想在別處測試。這裏我們只是想知道正確的方法會被正確的參數調用。

對於失敗,你可以這樣做:

[TestMethod] 
[ExpectedException(typeof(UnauthorizedException))] 
public void OnAuthenticateUnitAccountFailureTest() 
{ 
    IAuthenticationView view = MockRepository.GenerateStub<IAuthenticationView>(); 
    view.Stub(v => GetPlayerID()).Returns(1); 
    view.Stub(v => GetSecurityCode()).Returns(2); 

    FakeAuthenticator authenticator = MockRepository.GenerateMock<FakeAuthenticator>(); 
    authenticator.Expect(a => a.Authenticate(1, 2)) 
       .Throw(new UnauthorizedException()); 

    Controller controller = new Controller(view); 
    controller.AuthenticateUnitAccount += authenticator.Authenticate; 

    controller.OnAuthenicateAccount() 

    authenticator.VerifyAllExpectations(); 
} 
+0

不,它不是在控制器中。它實際上在主持人中。演示者獲取構造函數中分配的視圖是正確的。所有這些方法正在調用控制器正在監聽的事件。但你的例子肯定有幫助。 – nportelli 2008-12-16 21:42:42