c# - 没有注入(inject)的模拟

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

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

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

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

WCF 管理人员 资料库 数据库

测试管理器和存储库层非常简单,使用 Rhino Mocks 模拟依赖项并将它们注入(inject)被测层。

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

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

提前致谢。

最佳答案

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

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

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

public MyService(IDep1 d1, IDep2 d2)
{
}

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

关于c# - 没有注入(inject)的模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3521329/

相关文章:

c# - C# 中长值的枚举

c# - 在 C# 中规范化换行符

java - Spring-Boot应用程序默认有内存节省模式吗?

spring - 如何测试 Controller 方法是否将请求转发到特定 URL?

kotlin - 如何检查 mockk Mock 的构造函数参数?

c# - Entity Framework 不适用于可空列

c# - SignedXml checksignature 返回 false

c# - 使用 DI 访问 Startup.cs 中的 NPGSQL

dependency-injection - 为什么要使用依赖注入(inject)?

ios - RxSwift 在模拟的 UserDefaults 上观察测试用例