2

我是一个新项目,我应该扩展,所以我决定使用TDD快速识别我不完全了解的系统的任何问题。如何对使用ServiceStack Funq的DBService进行单元测试IOC

有一个类叫做DBService它“封装”了所有的数据库访问。例如,有一种称为getAllCustomers的方法,其返回Customers的列表。这将是这个样子(这仅仅是为了更好地理解为例):

public class DBService 
{ 
    public IDbConnectionFactory DBFactory { 
     get { return DI.Container.Resolve<IDbConnectionFactory>(); } 
    } 

    public List<Customer> GetAllCustomers() 
    { 
     try 
     { 
      using (var connection = DBFactory.OpenDbConnection()) 
      { 
       var dbResult = connection.Select<Customer>(); 
       // code ommitted 
      } 
     } 
     catch (Exception e) 
     { 
      // code ommitted 
     } 
    }  
} 

另一个问题是,在启动(在ServiceStack AppHost.Configure)如果不存在,所有的表创建的,对于一些表,如果他们存在一些列等添加(这可能是以后添加的变化)

当我现在例如必须扩展客户和添加另一个字段,地址我想这样做的TDD风格,但我不知道如何。

  1. 我不能注入任何DBFactory自吸气是私人
  2. 据我所知,我不能使用的OrmLiteConnectionFactory:memory:连接字符串,因为我使用ServiceStack 74年3月9日

那么,什么是我选择这里?

回答

2

避免服务定位器反模式,而是使用构造函数注入。尽量避免直接在依赖类中使用DI容器。它将你的课程紧密结合到不属于那里的问题上,并使得单独测试课程变得困难。

public class DBService { 
    private readonly IDbConnectionFactory connectionFactory; 

    public DBService(IDbConnectionFactory connectionFactory) { 
     this.connectionFactory = connectionFactory; 
    } 

    public IDbConnectionFactory DBFactory { get { return connectionFactory; } } 

    public List<Customer> GetAllCustomers() { 
     try { 
      using (var connection = DBFactory.OpenDbConnection()) { 
       var dbResult = connection.Select<Customer>(); 
       //... code omitted for brevity 
      } 
     } catch (Exception e) { 
      //... code omitted for brevity 
     } 
    } 
} 

两个Select<T>OpenDbConnection样子扩展方法。我会建议检查他们的预期是什么,并嘲笑这些行为。

如果DbService本身被用作其他类的依赖关系,那么该类也应该被抽象出来。

public interface IDbService { 
    IDbConnectionFactory DBFactory { get; } 
    List<Customer> GetAllCustomers(); 
} 

,并有实现继承

public class DbService : IDbService { 
    //... code removed for brevity 
} 

,并确保注册IoC容器的一切。

+0

是的我同意,服务定位器反模式是我应该尽量避免的。我只是认为现在没有太多的重构,有一种更简单的方法。 – zlZimon

+0

这是[技术债务](https://www.google.com/search?q=technical+debt)。它总是要求贷款。 – Nkosi

相关问题