【发布时间】:2014-05-30 15:09:20
【问题描述】:
我知道有人提出/回答了非常相似的问题,但我遇到了一个我无法解决的特殊情况。
我们正在创建一个用于其他应用程序的库,该库以用户实例化和使用的主库类为中心。这个类有多种依赖,部分设计要求要求我们不希望库的用户处理创建依赖对象图或处理初始化任务,因此我们将类构造函数设为私有,并具有他们从静态方法创建一个实例,该方法又创建一个类的实例并使用 IoC 容器解决依赖关系。像这样的:
public static ILibrary CreateInstance()
{
Library lib = new Library(
IoC.Instance.Resolve<IDependency1>(),
IoC.Instance.Resolve<IDependency2>(),
// etc
);
lib.Initialize();
return lib;
}
private Library(IDependency1, IDependency2, etc)
{
// some ctor setup here
}
测试这个的核心问题是 CreateInstance() 方法调用 IoC 容器的静态实例来处理依赖解析,这会阻止我们将模拟依赖注入到对象图中。
本着“如果你不知道如何测试它,你可能有设计缺陷”的精神,我想知道是否有人可以指出解决这个问题的正确方法。
【问题讨论】:
-
我的头脑:创建一个内部构造函数,让您的单元测试项目通过“InternalsVisibleTo”(仔细检查该名称)属性访问内部。如果您感兴趣,请搜索该方法。
-
你在哪里定义你的依赖是如何解决的?
-
@IanP IoC 类有一个静态构造函数,它调用私有 Initialize() 方法,我们在其中注册我们的依赖项。
-
嗯。那么它们是在代码中还是在 dependencies.config 文件中定义的?
-
我会切入正题:) 如果您在配置文件中定义依赖项,是否可以在测试时使用不同的配置?
标签: c# unit-testing