2012-06-02 4 views
1

나는 아래의 예와 유사한 클래스를 테스트하기 위해 노력하고 있습니다 : 부분 조롱 내 기대를 허용하지 않는 것부분 조롱 - 기대는 무시되고 (코뿔소 모의 객체)

public class Service : IService 
{ 
    public string A(string input) 
    {    
     int attemptCount = 5; 
     while (attemptCount > 0) 
     { 
      try 
      { 
       return TryA(input); 
      } 
      catch (ArgumentOutOfRangeException) 
      { 
       attemptCount--; 
       if (attemptCount == 0) 
       { 
        throw; 
       } 
       // Attempt 5 more times 
       Thread.Sleep(1000);       
      }      
     } 
     throw new ArgumentOutOfRangeException();    
    } 

    public string TryA(string input) 
    { 
    // try actions, if fail will throw ArgumentOutOfRangeException 
    } 
} 

[TestMethod] 
public void Makes_5_Attempts() 
{ 
    // Arrange 
    var _service = MockRepository.GeneratePartialMock<Service>(); 
    _service.Expect(x=>x.TryA(Arg<string>.Is.Anything)).IgnoreArguments().Throw(new ArgumentOutOfRangeException()); 

    // Act 
    Action act =() => _service.A(""); 

    // Assert 
    // Assert TryA is attempted to be called 5 times 
    _service.AssertWasCalled(x => x.TryA(Arg<string>.Is.Anything), opt => opt.Repeat.Times(5)); 
    // Assert the Exception is eventually thrown 
    act.ShouldThrow<ArgumentOutOfRangeException>(); 
} 

합니다. 테스트를 실행할 때 입력에 대한 오류가 발생합니다. 디버깅 할 때 메소드의 실제 구현이 기대 대신 실행되는 것을 볼 수 있습니다.

이 테스트를 올바르게 수행하고 있습니까? 문서 (http://ayende.com/wiki/Rhino%20Mocks%20Partial%20Mocks.ashx)에 따르면 : "부분 모의는 당신이 그 방법에 대한 기대를 정의하지 않으면 클래스에 정의 된 메소드를 호출 할 것입니다. 만약 당신이 기대를 정의했다면, 이것에 대한 일반적인 규칙을 사용할 것입니다."

+0

'TryA'는 가상 번호 – Steve

+0

@Steve이어야하며 문제가 해결 된 것으로 보입니다. 차라리 함수에 가상을 추가 할 필요는 없겠지만 매우 드물게 발생한다고 생각합니다. 감사! –

답변

2

Rhinomocks, Moq 및 NS substitute와 같은 조롱 프레임 워크는 동적 모방의 파생 클래스를 메모리에 동적으로 생성하는 DynamicProxy라는 .NET 기능을 사용한다는 점에 유의해야합니다. 수업은 다음과 같아야합니다.

  • 인터페이스가되어야합니다. 또는
  • 매개 변수없는 생성자가있는 비 밀폐 클래스. 또는

메소드는 인터페이스의 일부 또는 다른 동작이 실행시 대체 될 수 있도록 가상 이루어져야 (MOQ이 기능에서 멀리 이동) MarshalByRefObject에서 파생.