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

相關問題