2016-10-26 3 views
2

내가 (코뿔소와 NUNIT 사용) 테스트에서 예외를 throw하려고 던지는 아니지만,코뿔소 모의 객체는 예외

인터페이스

public interface IEmailService 
{ 
    void SendEmail(string to, string subject, string body); 
} 

public interface IWebService 
{ 
    void LogError(string message); 
} 

클래스

public class MockService : IWebService 
{ 
    public string LastError; 

    public void LogError(string message) 
    { 
     LastError = message; 
    } 
} 

public class LogAnalyzerDynamicMockWithEmail 
{ 
    public IWebService Service { get; set; } 
    public IEmailService Email { get; set; } 

    public void Analyze(string fileName) 
    { 
     try 
     { 
      if (fileName.Length < 8) 
       Service.LogError("Filename too short:" + fileName); 
     } 
     catch (Exception exception) 
     { 
      Email.SendEmail("a", "subject", exception.Message); 
     } 
    } 
} 
을 예상대로 작동하지 않습니다

이 시험 방법

[Test] 
    public void Analyze_WebServiceThrows_SendsEmail() 
    { 
     var mockRepository = new MockRepository(); 
     var stubWebService = mockRepository.Stub<IWebService>(); 
     var mockEmailService = mockRepository.StrictMock<IEmailService>(); 

     var logAnalyzerDynamicMockWithEmail = new LogAnalyzerDynamicMockWithEmail 
     { 
      Service = stubWebService, 
      Email = mockEmailService 
     }; 

     stubWebService.Stub(m => m.LogError("whatever")).IgnoreArguments().Throw(new Exception("fake exception")); 


     Assert.Throws<Exception>(() => { logAnalyzerDynamicMockWithEmail.Analyze("abc.ext"); }); 
     mockEmailService.AssertWasCalled(m => m.SendEmail("a", "subject", "fake exception")); 

    } 
이다

그러나 테스트가 실패하고 메시지가 "Expected: <system.exception>, but was: null"

내가 여기에 무엇을 놓치고 지적 할 수 누군가?

답변

0

귀하의 모의가 예외를 던지지 않은 이유를 모르겠지만 더 새로운 RhinoMock 구문 (MockRepository를 인스턴스화 할 필요가 없습니다)을 권하고 싶습니다. 또한 Assert.Throws 호출이 작동하지 않습니다. 코드가 예외를 catch하고 있습니다. 예외가 캐치되지 않는 경우에만 Assert.Throws가 유용합니다.

다음은 작동하는 예제입니다. 내가 분석 호출 위에 SendEmail 기대치를 옮겼습니다. 모의에 대한 기대치에 관계없이 VerifyAllExpectations를 호출하면 충족 여부를 확인할 수 있습니다.

[Test] 
public void Analyze_WebServiceThrows_SendsEmail_Modified() 
{ 
    var stubWebService = MockRepository.GenerateMock<IWebService>(); 
    var mockEmailService = MockRepository.GenerateMock<IEmailService>(); 

    var logAnalyzerDynamicMockWithEmail = new LogAnalyzerDynamicMockWithEmail 
    { 
     Service = stubWebService, 
     Email = mockEmailService 
    }; 

    // Set up our expectations 
    stubWebService.Expect(m => m.LogError("whatever")).IgnoreArguments().Throw(new Exception("fake exception")); 
    mockEmailService.Expect(m => m.SendEmail("a", "subject", "fake exception")).Repeat.Once(); 

    logAnalyzerDynamicMockWithEmail.Analyze("abc.ext"); 

    // Verify our SendEmail method was called 
    mockEmailService.VerifyAllExpectations(); 
} 
0

당신의 .Analyze() 방법은 예외를 잡기하고 rethrowing하지, 그래서 방법으로 다시 Assert.Thows() 호출의 수 없습니다입니다.

catch (Exception exception) 
{ 
    Email.SendEmail("a", "subject", exception.Message); 
} 

따라서 테스트가 올바르게 실패합니다. Analyze()에 대한 호출은 이 아니며 예외를 throw합니다. 대신, 당신의 모의에 의해 던져진 예외를 잡아 내고, 이메일을 보내고 계속합니다. 던지려면 catch 블록에서 예외를 다시 던져야합니다.