【问题标题】:Dependency injection for NServiceBus handler unit testingNServiceBus 处理程序单元测试的依赖注入
【发布时间】:2012-06-08 21:40:02
【问题描述】:

这就是你应该为你的 NServiceBus 处理程序注入依赖项来测试它的方式:

Test.Handler<YourMessageHandler>()
  .WithExternalDependencies(h => h.Dependency = yourObj)

(http://nservicebus.com/UnitTesting.aspx)

但这意味着我的依赖对象引用应该是公开的,我不太喜欢。有什么办法让它保持私有只读并在构造函数中分配它,以便实现应该只通过处理程序构造函数传递?

谢谢

【问题讨论】:

    标签: c# unit-testing dependency-injection nservicebus


    【解决方案1】:

    您可以使用以下语法来使用构造函数注入:

     Test.Handler<YourMessageHandler>(bus => new YourMessageHandler(dep1, dep2))
    

    其中 dep1 和 dep2 很可能只是您的模拟框架为您准备的一些存根或模拟。

    -- 由 Udi Dahan 从这里更新:

    您可以通过 Test.Bus 访问模拟的总线实例。

    【讨论】:

    • 我尝试了这种方法,但问题是我的处理程序的 IBus 属性在这种情况下恰好为 null,我需要正确初始化它
    • 你的意思是在处理程序中引用 IBus 吗?不能为此添加构造函数参数吗?您应该能够简单地执行public YourMessageHandler(IDependency dep1, IOtherDependency dep2, IBus bus) 的效果并从那里简单地分配它。如果我遗漏了一些明显的东西,我深表歉意,我以前从未遇到过任何问题来获得我需要的参考资料。
    • 对,在处理程序内部使用了 Bus.Send(...),所以我需要验证它的执行情况。问题是我不知道如何实例化 IBus 类型的属性,它应该由 NServiceBus 神奇地完成,我什至没有看到接口的任何公共实现,没有“总线”类或其他东西。我的意思是它是 NServiceBus 库对我们开发人员隐藏的东西
    • 我通常模拟单元测试的所有依赖项,这包括 IBus。是的,我还将 IBus 放入构造函数中并在那里注入。 (犀牛模拟 - MockRepository.GenerateStub&lt;IBus&gt;()
    • dtryon,就像我说的,我的目的是使用适当的参数值验证 IBus 的 Send 方法调用(参见 ExpectSend 方法),所以我需要 NServiceBus 自己模拟它。关于模拟 IBus 的第二件事是我不知道将其映射到哪种真实对象,因为 StructureMap 会在运行时调用此构造函数,我需要通知 StructureMap 哪个特定类用于 IBus 接口: x.For&lt;IBus&gt;().Use&lt;???&gt;()
    猜你喜欢
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 2021-05-29
    • 2018-03-03
    相关资源
    最近更新 更多