2015-02-26 2 views
0

Я понимаю, что структура MOQ на самом деле не была предназначена для помощи в этом случае, но, возможно, вы могли бы помочь ...NUnit & MOQ: Тестирование попытки поймать, что вызывает другой метод, когда исключение исключено

У меня есть метод, который использует try/catch, который вызывает метод уведомления всякий раз, когда генерируется исключение. То, что я пытаюсь сделать, это создать интеграционный/модульный тест, который проверяет, будет ли вызываться SendNotification при вызове любого исключения.

Метод проверяемого:

public virtual void MonitorIntradayBuilds(IIntradayBuilds intradayBuilds) 
{ 
    try 
    { 
     var intradayBuildFound = intradayBuilds.CheckForIntradayBuilds(); 
     if (intradayBuildFound && !IntradayBuildsComplete && !DailyBuildsFound) 
     { 
      IntradayBuildsComplete = intradayBuilds.StartIntradayBuilds(); 
      //should start daily builds? 
     } 
    } 
    catch (Exception ex) 
    { 
     SendNotification("MonitorIntradayBuilds threw an exception", ex); 
    } 
} 

Test Case:

[Test] 
    public void it_should_notify_developers_immediately_if_there_is_a_problem_when_checking_for_intraday_builds() 
    { 
     //Arrange 
     var mockDua = new Mock<DUA>(); 
     var mockIB = new Mock<IIntradayBuilds>(); 

     //Act 
     mockIB.Setup(x => x.CheckForIntradayBuilds()).Throws(new Exception()); 
     mockDua.Object.MonitorIntradayBuilds(mockIB.Object); 

     //Assert 
     mockDua.Verify(x => x.SendNotification(It.IsAny<string>(), It.IsAny<Exception>()), Times.Once); 
    } 

Я продолжаю ударять Moq.MockException, а затем посмотреть, что SendNotification «ожидал вызова на издеваться один раз, но был 0 раз ... "

Я попытался использовать атрибут [ExpectedException] в тестовом примере, но безрезультатно. Он пропускает тест, но не вызывает метод SendNotification.

Любые идеи?

ответ

1

Решено.

Оказывается, вам необходимо установить свойство CallBase в системном тестировании, которое вы издеваетесь.

Тестовый случай теперь:

[Test] 
    public void it_should_notify_developers_immediately_if_there_is_a_problem_when_checking_for_intraday_builds() 
    { 
     //Arrange 
     var mockDua = new Mock<DUA>(); 
     var mockIB = new Mock<IIntradayBuilds>(); 
     mockDua.CallBase = true; // <<<< Added this line! 

     //Act 
     mockIB.Setup(x => x.CheckForIntradayBuilds()).Throws(new Exception()); 
     mockDua.Object.MonitorIntradayBuilds(mockIB.Object); 

     //Assert 
     mockDua.Verify(x => x.SendNotification(It.IsAny<string>(), It.IsAny<Exception>()), Times.Once); 
    } 

Надеюсь, кто-то считает полезным :)

Смежные вопросы