2016-11-03 1 views
1

я побежал через некоторый код в одном из наших услуг, который выглядит следующим образом:NServiceBus: Тестирование этого события публикуется и исключение в то же время

try 
{ 
    // Step 1: collect underpants. 
} 
catch (Exception ex) 
{ 
    // If this is the last retry we'll raise an event. 
    if (Bus.IsLastRetry()) 
    { 
     PublishFailedEvent(ex); 
    } 

    // But we'll also send the error to the error queue no matter what. 
    throw; 
} 

И тест, который выглядит следующим образом:

Test.Handler(bus => new Processor() { Bus = bus }) 
    .ExpectPublish<IFailedEvent>() 
    .OnMessage<ISomeHappenedEvent>(); 

Потому что мы бросаем сразу после публикации теста. Есть ли способ проверить, что публикация FailedEvent опубликована, и генерируется исключение?

+0

использование Thread.Sleep в течение некоторого времени –

+0

@viveknuna, что не является полезным предложением в любом случае. –

ответ

2

Просто заверните вызов Test() в try catch, а затем откройте исключение. В зависимости от версии NSB обработчик может вызвать исключение TargetInvocationException, которое вам нужно будет допросить, чтобы получить внутреннее исключение.

try 
{ 
    Test.Handler(bus => new Processor() { Bus = bus }).OnMessage<ISomeHappenedEvent>(); 
} 
catch (MyExpectedException ex) 
{ 
    // Asserts 
    ... 
} 

или

try 
{ 
    Test.Handler(bus => new Processor() { Bus = bus }).OnMessage<ISomeHappenedEvent>(); 
} 
catch (TargetInvocationException ex) 
{ 
    // Asserts against ex.InnerException 
    ... 
} 
1

если вы используете NUnit TestFramework вы также можете использовать атрибуты для тестирования ожидаемого исключения

[Test] 
    [ExpectedException(typeof(MyException))] 
    public void it_should_throw_attribute() 
    { 
     Assert.Fail(); 
    } 

или, если вы предпочитаете использовать fluent assertions вы также можете использовать это и проверку для конкретного типа исключенного исключения или просто базового исключения и для дальнейшей проверки, для примера, содержащего InnerException, Message, ...

[Test] 
    public void it_should_throw_exactly() 
    { 
     Action actionToTest =() => { throw new MyException(); }; 
     actionToTest.ShouldThrowExactly<MyException>(); 
    } 

    [Test] 
    public void it_should_throw() 
    { 
     Action actionToTest =() => { throw new MyException(); }; 
     actionToTest.ShouldThrow<Exception>(); 
    } 
0

Если обработчик выбрасывает исключение, ожидания не будут проверяться. Чтобы проверить это, вы можете ввести булевский флаг обработчику и разделить тест на два теста. т.е.

[Test] 
public void it_should_publish_event() 
{ 
    Test.Handler(bus => new Processor() { Bus = bus, DoNotThrow = true }) 
     .ExpectPublish<IFailedEvent>() 
     .OnMessage<ISomeHappenedEvent>(); 
} 

[Test, ExpectedException(typeof(YourException))] 
public void it_should_throw() 
{ 
    Test.Handler(bus => new Processor() { Bus = bus }) 
     .OnMessage<ISomeHappenedEvent>(); 
} 

Имейте в виду, что если транспорт сконфигурирован с помощью DTC или Исходящие, то это событие не будет печататься, если исключение в обработчик (если публиковать не сконфигурировано с немедленной отправки).

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