没有注射就嘲笑

Sim*_*gby 5 c# wcf dependency-injection rhino-mocks mocking

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

我一直在为已经存在的代码编写测试(是的,我知道它的方法是错误的,但这就是我现在的合同的结果).我已经做了很多重新分解以支持模拟 - 注入依赖项,添加额外的接口等 - 所有这些都改进了设计.一般来说,我的测试经验一直很顺利(暴露脆弱性和改善脱钩).对于任何物体,我一直在创造依赖的模拟,这对我来说很合适并且有意义.

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

WCF管理器存储库数据库

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

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

我希望这是有道理的,任何帮助都非常感激.我知道TypeMockIsolator等,但是出于预算和其他原因,我真的不想走这条路,我不会在这里讨论.此外,我确信有很多聪明的"堆叠器"拥有我需要的信息.

提前致谢.

PHe*_*erg 2

是否有特定原因导致您的服务无法使用构造函数?

如果没有,您可以使用重载构造函数,其中一个默认构造函数连接默认值,并使用一个参数化构造函数与您的依赖项连接。您现在可以测试参数化 ctor 并依赖默认 ctor 在生产中创建实例。

public MyService() : this(new DefaultDep1(), new DefaultDep2())
{
}

public MyService(IDep1 d1, IDep2 d2)
{
}
Run Code Online (Sandbox Code Playgroud)

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