繁体   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