我想测试处理给定的消息实例是否会导致处理失败。但是,我看不到执行此操作的方法,因为处理程序中引发的任何异常都不会冒泡到测试代码,并且似乎没有为此内置任何内容。
理想情况下我想这样做:
Test.Handler<TransactionCreatedHandler>()
.ExpectFailure()
.OnMessage(financialTransaction, Guid.NewGuid().ToString());
我知道正确的做法是从处理程序中删除所有处理代码并单独测试它,但我仍然想知道是否有办法做到这一点。
有人有什么想法吗?
最佳答案
我通过将 Test.Handler 包装在 try 中并捕获 TargetInvocationException
,然后针对 InnerException
进行断言来解决此问题。
try
{
Test.Handler<TransactionCreatedHandler>()
.OnMessage(financialTransaction, Guid.NewGuid().ToString());
}
catch (TargetInvocationException ex)
{
// Asserts against ex.InnerException
...
}
这显然会带来风险,即 NSB 实现的更改将破坏这些测试,尽管我愿意承担这一测试。
合并来自 Daniel Marbach 的评论:
在版本 5 及更高版本中,行为发生了变化。测试库不再抛出TargetInitationException,而是抛出handle 方法中实际发生的异常。请注意 -
关于nservicebus 3.2 测试预期失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18634647/