【问题标题】:In memory Service Bus (NServiceBus)内存服务总线 (NServiceBus)
【发布时间】:2013-11-14 07:07:42
【问题描述】:

我想知道是否有办法通过配置将 NServiceBus 置于将消息写入内存队列而不是物理队列的模式?

我的用例是Integration testing。理想情况下,我想避免将消息放在物理队列上,以避免集成测试对队列的依赖。我的测试侧重于测试将消息放在总线上的代码的逻辑,但如果队列不存在,测试将失败。

现在我在测试中手动创建队列,但想避免这种情况。

每当我执行bus.Send(queueMessageObject); 时,我都希望消息仅存储在内存中(或者可能只是被忽略,因为我只是在测试将其放在那里的逻辑)。

在我的unit tests 中,我可以通过使用 MOQ 模拟 IBus 对象来解决这个问题。但是,在我的集成测试中,我没有模拟总线,而是希望将消息发送到内存端点。我也不想使用与bus.Send() 不同的api 将消息放在总线上。

是否有当前/未来的 NServiceBus 配置设置可以做到这一点?

【问题讨论】:

    标签: c# unit-testing integration-testing nservicebus


    【解决方案1】:

    是的,我们计划支持它,请参阅https://github.com/Particular/NServiceBus/issues/1357

    【讨论】:

    • 谢谢。这是否意味着我们可能对 bus.UseTransport 有一些变化来配置自定义端点?
    • 是的,你可以这么说,所以我们会有一个 InMemoryTransport
    【解决方案2】:

    我也不希望使用与 bus.Send() 不同的 api 将消息放在总线上。

    为什么不呢?拥有使用 NServiceBus 实现的自己的抽象可以让您拥有许多其他实现和/或轻松地在不同总线之间切换。

    我们有一个参数化工厂,它返回少数实现之一,消息可以放在日志中,写入文件,通过 wcf 发送等。这让我们可以创建许多不同的单元/集成测试。

    【讨论】:

    • 我同意有多种方法可以使用我自己的层来抽象它。一般而言,毫无疑问它的有用性。然而,这是一个包含许多 bus.Send() 调用的现有代码库。我只是好奇这在技术上是否可行。我还看到了通过与我的生产代码路径相同的配置运行它的一些价值 - 无需通过抽象跳过它。
    • 4.0 支持所谓的内存总线,但是发布 api 似乎不同于常规发布support.nservicebus.com/customer/portal/articles/…
    • 是的,我之前发现了这个 API,但我希望不必通过这个路由我的调用 :-) 我想这可能是这个场景中唯一基于 NServiceBus 的解决方案,所以它可能不是可以做我想做的事。
    猜你喜欢
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 2016-12-31
    • 1970-01-01
    相关资源
    最近更新 更多