【问题标题】:Mocking without injection模拟不注入
【发布时间】:2010-08-19 11:37:12
【问题描述】:

(C#、WCF 服务、Rhino Mocks、MbUNit)

我一直在为已经到位的代码编写测试(是的,我知道这是错误的方法,但这就是我当前合同的结果)。我已经做了很多重构来支持模拟——注入依赖项、添加额外的接口等——所有这些都改进了设计。一般来说,我的测试经验一直很顺利(暴露脆弱性并改善解耦)。对于我一直在创建依赖模拟的任何对象,这对我来说很合适并且很有意义。

该应用程序本质上具有 4 个物理层。数据库,用于数据访问的存储库层,通过管理(或业务逻辑)层连接到存储库的 WCF 服务,所以自上而下看起来是这样的;

WCF 经理人 存储库 数据库

测试管理器和存储库层非常简单,使用 Rhino Mocks 模拟依赖关系并将它们注入到被测层中。

我的问题在于测试顶级 WCF 层。由于我的服务没有允许我注入依赖项的构造函数,因此我不确定在测试服务上的公共方法 (ServiceContracts) 时如何模拟依赖项。

我希望这是有道理的,并且非常感谢任何帮助。我知道 TypeMockIsolator 等,但出于预算和其他原因,我真的不想走那条路,我不会在这里介绍。此外,我确信有很多聪明的“堆垛者”拥有我需要的信息。

提前致谢。

【问题讨论】:

    标签: c# dependency-injection mocking wcf rhino-mocks


    【解决方案1】:

    您的服务上不能有构造函数是否有特定原因?

    如果没有,您可以使用默认构造函数来重载构造函数,并将默认构造函数和一个参数化构造函数与您的依赖项联系起来。您现在可以测试参数化 ctor 并依靠默认 ctor 在生产环境中创建实例。

    public MyService() : this(new DefaultDep1(), new DefaultDep2())
    {
    }
    
    public MyService(IDep1 d1, IDep2 d2)
    {
    }
    

    如果您使用依赖注入,更好的解决方案是使用 WCF IInstanceProvider interface 创建您的服务实例并通过该注入点提供所需的依赖。可以找到使用结构图的示例here

    【讨论】:

    • 谢谢,这听起来确实像我需要走的路线。感谢您的链接.. 非常有用。
    • 感谢大家的帮助。虽然有些答案是相似的.. 选择这个是因为它简洁并表明问题的直接解决方案。再次感谢大家。
    【解决方案2】:

    您可以使 WCF 服务成为“管理器”之上的一个薄层,因此它们中几乎没有或根本没有需要测试的逻辑。然后不要测试他们,只测试经理。或者,您可以通过另一个包含来自服务的逻辑的“服务”层来实现类似的效果,可以对其进行测试,并让实际的 WCF 代码直接传递给该层。

    【讨论】:

    • 好的..谢谢你..我曾考虑过做类似的事情,但试图避免引入一个层。但很高兴确认它是一种可能性。
    【解决方案3】:

    我们的 WCF 服务从 Factory 对象中获取其所有依赖项,并且我们为该服务提供了一个采用 IFactory 的构造函数。因此,如果我们想编写一个模拟其中一个依赖项的测试,比如一个 IDependency,我们只需要注入一个模拟工厂,该工厂被编程为将模拟的 IDependency 对象返回给服务。

    【讨论】:

    • 我是否正确地说您正在有效地引入第二个构造函数只是为了允许您对其进行配置以进行测试?不是说我不同意,只是确保我理解它。
    • 是的,我并不是说它很棒,它只是我们使用的,它工作正常。
    • 我也使用这种方法来测试不是为它设计的遗留代码。有点丑,但是很有效。
    【解决方案4】:

    如果您使用控制反转 (IoC),例如 Unity、AutoFac 或 Castle Windsor,以及模拟框架(例如 Moq、NMock、RhinoMocks),只要您有正确的设计,这就足够简单了。

    有关如何使用 RhinoMock 和 Windsor 的优秀教程,请查看这篇博客文章 - http://ayende.com/Blog/archive/2007/02/10/WCF-Mocking-and-IoC-Oh-MY.aspx

    【讨论】:

    • 嗨 .. 并感谢您的文章(读得很好),但我认为这不是我想要的。这篇文章提到了模拟服务。我真的不想模拟它,我想测试它,但它有我需要模拟的依赖项,我无法注入。 (除非我错过了什么)
    【解决方案5】:

    如果您使用的是Castle Windsor,请查看WCF facility,它允许您使用非默认构造函数并将依赖项注入您的服务等。

    【讨论】:

    • 我不是没有......但我觉得我应该看看它:)。感谢您的提示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 2018-01-11
    相关资源
    最近更新 更多