gpt4 book ai didi

c# - 如何对使用 Servicestack Funq IOC 的 DBService 进行单元测试

转载 作者:行者123 更新时间:2023-11-30 23:16:32 25 4
gpt4 key购买 nike

我是一个我应该扩展的项目的新手,所以我决定使用 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. 我不能注入(inject)任何 DBFactory 因为 getter 是私有(private)的
  2. Afaik 我不能为 OrmLiteConnectionFactory 使用 :memory: 连接字符串,因为我使用的是 ServiceStack 3.9.74

那么我的选择是什么?

最佳答案

避免服务定位器反模式并改用构造函数注入(inject)。尽量避免直接在依赖类中使用 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 容器注册所有内容。

关于c# - 如何对使用 Servicestack Funq IOC 的 DBService 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41957605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com