簡體   English   中英

如何對使用 Servicestack Funq IOC 的 DBService 進行單元測試

[英]How to unit test DBService which uses the Servicestack Funq IOC

我是一個我應該擴展的項目的新手,所以我決定使用 TDD 來快速識別我不完全理解的系統的任何問題。

有一個名為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. 由於 getter 是私有的,因此我無法注入任何DBFactory
  2. Afaik 我不能使用:memory:連接字符串作為OrmLiteConnectionFactory因為我使用的是 ServiceStack 3.9.74

那么我在這里有哪些選擇?

避免服務定位器反模式並使用構造函數注入代替。 盡量避免在依賴類中直接使用 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 容器注冊所有內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM