如何在没有DI的情况下在紧密耦合的业务\数据层上启用单元测试?

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)

Pau*_*ips 5

本身并不排除构造函数注入,你只是没有设置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)

不要忘记在实际代码中使用您想要使用的实际工厂的默认值.