2016-10-26 5 views
2

Я пытаюсь бросить исключение из теста (с использованием носорога и NUnit), но он не работает, как ожидалосьRhino Mocks не бросает исключение

Интерфейсы

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() делает не выдает исключение. Вместо этого он ловит исключение, вызванное вашим макетом, отправляет электронное письмо и продолжает работу. Если вы хотите его бросить, вам нужно перестроить исключение в блоке catch следующим образом:

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