[英]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.