2009-10-05 3 views
2

Rhino Mock에서 새로운 AAA 구문이 어떻게 작동하는지 이해하기가 어려워요. 대부분의 테스트는 다음과 같습니다.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을 호출하지 않았을 때 테스트를 통과 할 수 없다고 가정합니다. 다른 주장들 중 적어도 하나는 실패 할 것입니다.

이것은 실제로 좋은 것입니다.

  • 스텁을 TestInitialize로 이동할 수 있으므로 테스트에서 스텁 된 메서드가 호출되지 않아도 아프지 않습니다 (예상치 못한 결과입니다). 검사가 더 짧아 질 것입니다.
  • 테스트에서는 테스트중인 시스템이 "어떻게"작업을하는지 모릅니다. 결과 만 확인하십시오. 테스트가 더욱 정비 가능해질 것입니다.

당신이 실제로하는 방법은 모의에서 호출 된 경우 확인해야 다른 시나리오가있다. 주로 void를 반환하는 경우. 예를 들어 이벤트가 발생 했어야하고 커밋 된 트랜잭션이 있어야합니다. 이를 위해 AssertWasCalled을 사용

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

    // Act 
    FunctionBeingTested(sth); 

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

참고 : 값을 반환하지가있다, 그래서 스텁이 없습니다. 이것은 이상적인 경우입니다. 물론 StubAssertWasCalled을 모두 가질 수 있습니다.


실제로 이전 구문처럼 행동하는, 또한 ExpectVerifyAllExpectations 있습니다. 같은 테스트에서 StubAssertWasCalled이 필요하면 두 번 쓰고 싶지 않은 complext argument 제약 조건을 가지고있을 때만 사용합니다. 일반적으로 은 회피합니다.VerifyAllExpectations

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(); 
    } 

의 변화하지만 그건 단지 긴 샷입니다. 내가 의심하는대로 썼다. 대부분의 아마 이런