Nul*_*nce 3 c# unit-testing dependency-injection
我正在开发一个较旧的3层设计项目,添加的任何新功能都需要进行单元测试.
问题是业务层/数据层紧密耦合,如下面的示例所示.BL只是新闻数据层对象...所以几乎不可能以这种方式进行模拟.我们没有实现任何依赖注入,因此无法进行构造函数注入.那么,修改结构的最佳方法是什么,这样可以在不使用DI的情况下模拟数据层?
public class BLLayer()
{
public GetBLObject(string params)
{
using(DLayer dl = new DLayer())
{
DataSet ds = dl.GetData(params);
BL logic here....
}
}
}
Run Code Online (Sandbox Code Playgroud)
你本身并不排除构造函数注入,你只是没有设置IOC容器.没关系,你不需要.你可以做穷人的依赖注入,仍然保持构造函数注入.
使用接口包装DataLayer,然后创建一个将按IDataLayer命令生成对象的工厂.将此字段作为字段添加到您尝试注入的对象中,将所有字段替换new为对工厂的调用.现在你可以注入你的假货进行测试,如下所示:
interface IDataLayer { ... }
interface IDataLayerFactory
{
IDataLayer Create();
}
public class BLLayer()
{
private IDataLayerFactory _factory;
// present a default constructor for your average consumer
ctor() : this(new RealFactoryImpl()) {}
// but also expose an injectable constructor for tests
ctor(IDataLayerFactory factory)
{
_factory = factory;
}
public GetBLObject(string params)
{
using(DLayer dl = _factory.Create()) // replace the "new"
{
//BL logic here....
}
}
}
Run Code Online (Sandbox Code Playgroud)
不要忘记在实际代码中使用您想要使用的实际工厂的默认值.
| 归档时间: |
|
| 查看次数: |
782 次 |
| 最近记录: |