[英]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 樣式執行此操作,但我不知道該怎么做。
DBFactory
: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.