使用自定义处理程序测试 NServiceBus 行为

问题描述

我有一个带有自定义属性的 MessageHandler。我正在测试的行为基于该属性的值执行某些操作。 The NServicebus documentation 仅提供基于模拟处理程序的行为的单元测试示例。我如何使用我自己的假货或有其他方法可以测试我的行为?

// A fake message handler containing the attribute
[ExecuteHandler(true)]
class FakeHandler : IHandleMessages<FakeCommand>
{
  public Task Handle(FakeCommand message,IMessageHandlerContext context) => Task.CompletedTask;
}

[Test]
public async Task Invoke_GivenHandlerWithoutAttribute_InvokeNext()
{
  // Given
  var handlerExecuted = false;
  var context = new TestableMessageHandlerContext
  {
    // I want to add my fake handler to the context so I can test if it gets executed. Problem is that I can't cast my handler to type MessageHandler
    // MessageHandler = new FakeHandler(),}

  // When
  await _behavior.Invoke(context,() =>
  {
    handlerExecuted = true;
    return Task.CompletedTask;
  });

  // Then
  handlerExecuted.Should().BeTrue();
}

解决方法

回答我自己的问题。我通过让我的处理程序继承 MessageHandler 使其工作。

[Test]
public async Task Invoke_GivenHandlerWithAttributeTrue_InvokeNext()
{
  // Given
  var handlerExecuted = false;
  var context = new TestableMessageHandlerContext
  {
    MessageHandler = new MessageHandler(null,typeof(FakeHandler)),}
  
  // When
  await _behavior.Invoke(context,() =>
  {
    handlerExecuted = true;
    return Task.CompletedTask;
  });

  // Then
  handlerExecuted.Should().BeTrue();
}

[Test]
public async Task Invoke_GivenHandlerWithAttributeFalse_DoesNotInvokeNext()
{
  // Given
  var handlerExecuted = false;
  var context = new TestableMessageHandlerContext
  {
    MessageHandler = new MessageHandler(null,typeof(FakeHandlerNotExecuting)),() =>
  {
    handlerExecuted = true;
    return Task.CompletedTask;
  });

  // Then
  handlerExecuted.Should().BeFalse();
}
[ExecuteHandler(true)]
class FakeHandler: IHandleMessages<FakeCommand>
{
  public Task Handle(FakeCommand message,IMessageHandlerContext context) => Task.CompletedTask;
}
[ExecuteHandler(false)]
class FakeHandlerNotExecuting: IHandleMessages<FakeCommand>
{
  public Task Handle(FakeCommand message,IMessageHandlerContext context) => Task.CompletedTask;
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...