2009-10-05 92 views
2

我很努力瞭解新的AAA語法在Rhino Mocks中的工作原理。我的大多數測試如下所示:Rhino Mocks的新語法

[Test] 
    public void Test() 
    { 
     //Setup 
     ISth sth= mocks.DynamicMock<ISth>(); 

     //Expectations 
     Expect.Call(sth.A()).Return("sth"); 

     mocks.ReplayAll(); 
     //Execution 
     FunctionBeingTested(sth); 
     //...asserts, etc 

     //Verification 
     mocks.VerifyAll(); 
    } 

它會如何使用AAA語法?從Ayende`s博客

回答

3

最有可能是這樣的:

[Test] 
public void Test() 
{ 
    // Arrange 
    ISth sth= MockRepository.GenerateMock<ISth>(); 

    sth 
     .Stub(x => x.A()) 
     .Return("sth"); 

    // Act 
    FunctionBeingTested(sth); 

    // Assert 
} 

要真正從新AAA語法中獲益,你必須改變你的想法一點。我嘗試解釋。

我的建議存在一個主要區別:沒有「預期驗證」。所以我建議不要期待這個調用,因爲有一個返回值。我假設該方法在沒有調用sth.A時無法通過測試,因爲它會錯過正確的返回值。它至少會失敗其中一個斷言。

這實際上是一件好事。

  • 你可以將Stub移動到TestInitialize,當測試中沒有調用stubbed方法時(這不是期望值),它不會傷害。你的測試會變得更短。
  • 您的測試不知道「如何」測試系統完成這項工作,您只檢查結果。您的測試將變得更加可維護。

還有另外一種情況,你確實需要檢查的方法已呼籲模擬。主要是如果它返回無效。例如:事件應該已經被解僱,交易已經完成,等等。使用AssertWasCalled此:

[Test] 
public void Test() 
{ 
    // Arrange 
    ISth sth= MockRepository.GenerateMock<ISth>(); 

    // Act 
    FunctionBeingTested(sth); 

    // Assert 
    sth 
     .AssertWasCalled(x => x.A()); 
} 

注:沒有返回值,所以沒有存根。這是一個理想的情況。當然,你可以同時擁有兩個,分別是StubAssertWasCalled


還有ExpectVerifyAllExpectations,這實際上表現爲舊的語法。我只會在你使用時需要StubAssertWasCalled在相同的測試中,你有完整的參數約束,你不想寫兩次。通常,避免ExpectVerifyAllExpectations

1

例如:

[Test] 
public void WhenUserForgetPasswordWillSendNotification_UsingExpect() 
{ 
    var userRepository = MockRepository.GenerateStub<IUserRepository>(); 
    var notificationSender = MockRepository.GenerateMock<INotificationSender>(); 

    userRepository.Stub(x => x.GetUserById(5)).Return(new User { Id = 5, Name = "ayende" }); 
    notificationSender.Expect(x => x.Send(null)).Constraints(Text.StartsWith("Changed")); 

    new LoginController(userRepository, notificationSender).ForgotMyPassword(5); 

    notificationSender.VerifyAllExpectations(); 
} 

的變化在你的測試

[Test] 
    public void Test() 
    { 
     //Arrange 
     var sth= MockRepository.GenerateMock<ISth>(); 
     sth.Expect(x=>sth.A()).Return("sth"); 

     //Act 
     FunctionBeingTested(sth); 

     //Assert 
     sth.VerifyAllExpectations(); 
    } 

但是,這只是一個長鏡頭。寫下它,因爲我懷疑它是。