2016-10-26 6 views
2

私は(サイとNUnitのを使用して)、テストから例外をスローしようとしていますを投げていないが、Rhinoのモックは例外

インタフェース

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コールは機能しません。コードが例外をキャッチしています。 Assert.Throwsは、例外がキャッチされない場合にのみ有用です。

実例があります。私はSendEmailの期待をAnalyzeコールの上に移動しました。モックの期待数にかかわらず、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()メソッドは例外をキャッチし、それを再スローではないので、それは帰りAssert.Thows()コールにいますことはありませんされています。

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

あなたのテストは正しく失敗しています。 Analyze()への呼び出しはではなく、例外をスローします。代わりに、あなたのモックによってスローされた例外をキャッチし、電子メールを送信し続けます。スローするには、ブロックの例外を次のように再スローする必要があります。

関連する問題