ormlite-servicestack,servicestack-ioc,C#,Unit Testing,Mocking,ormlite Servicestack,Servicestack Ioc" /> ormlite-servicestack,servicestack-ioc,C#,Unit Testing,Mocking,ormlite Servicestack,Servicestack Ioc" />

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

C# 如何对使用Servicestack Funq IOC的DBService进行单元测试,c#,unit-testing,mocking,ormlite-servicestack,servicestack-ioc,C#,Unit Testing,Mocking,ormlite Servicestack,Servicestack Ioc,我是一个新的项目,我应该扩展,所以我决定使用TDD来快速识别我不完全理解的系统的任何问题 有一个名为DBService的类,它“封装”了所有数据库访问。例如,有一个名为getAllCustomers的方法,它返回客户的列表。这看起来像这样(这只是一个更好理解的示例): 公共类DBService { 公共IDbConnectionFactory数据库工厂{ 获取{return DI.Container.Resolve();} } 公共列表GetAllCustomers() { 尝试 { 使用(va

我是一个新的项目,我应该扩展,所以我决定使用TDD来快速识别我不完全理解的系统的任何问题

有一个名为
DBService
的类,它“封装”了所有数据库访问。例如,有一个名为
getAllCustomers
的方法,它返回
客户的列表。这看起来像这样(这只是一个更好理解的示例):

公共类DBService
{
公共IDbConnectionFactory数据库工厂{
获取{return DI.Container.Resolve();}
}
公共列表GetAllCustomers()
{
尝试
{
使用(var connection=DBFactory.OpenDbConnection())
{
var dbResult=connection.Select();
//编码
}
}
捕获(例外e)
{
//编码
}
}      
}
另一个问题是,在开始时(在ServiceStack
AppHost.Configure
中),如果不存在所有表,则会创建所有表;对于某些表,如果存在,则会添加一些列等(可能是后来添加的更改)

例如,当我现在必须扩展customer并添加另一个字段时,我希望以TDD样式进行扩展,但我不知道如何进行

  • 我无法注入任何
    DBFactory
    ,因为getter是私有的
  • Afaik我无法使用
    :内存:
    连接字符串作为
    或mliteConnectionFactory
    ,因为我使用的是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
            }
        }
    }
    
    并让实现继承

    public class DbService : IDbService { 
        //... code removed for brevity
    }
    

    并确保在IoC容器中注册所有内容。

    是的,我同意,我应该尽量避免使用服务定位器反模式。我只是认为现在有一种更简单的方法,不用进行太多重构。这就是我们的问题所在。它总是要求贷款。
    public interface IDbService {
        IDbConnectionFactory DBFactory { get; }
        List<Customer> GetAllCustomers();
    }
    
    public class DbService : IDbService { 
        //... code removed for brevity
    }