NServiceBus:测试事件是否发布,同时抛出异常
本文关键字:抛出异常 测试 事件 是否 NServiceBus | 更新日期: 2023-09-27 18:16:12
我在我们的一个服务中遇到一些代码,看起来像这样:
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并抛出异常?
只需在try catch中包装对Test()的调用,然后对异常进行断言。根据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
...
}
如果你使用NUnit TestFramework,你也可以使用属性来测试预期的异常
[Test]
[ExpectedException(typeof(MyException))]
public void it_should_throw_attribute()
{
Assert.Fail();
}
或者如果你喜欢使用流畅断言,你也可以使用这个来检查抛出异常的确切类型,或者只是基异常,并做进一步的检查,例如包含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>();
}
如果处理程序抛出异常,则不会检查期望。要测试这一点,您可以向处理程序引入一个布尔标志,并将测试分成两个测试。例如
[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或Outbox配置的,那么如果在处理程序中抛出异常,则不会发布此事件(除非发布配置为立即调度)。