我已经设置了一个测试数据库来开始对我最近添加的应用程序进行单元测试。它是一个3层设计(表示层,BOL和DAL),这是我第一次编写单元测试。

我决定从BOL开始,我认为最好的方法是将ConnectionString(已作为共享字符串传递)替换为指向我的新测试数据库的ConnectionString。但是,我不想更改任何生产代码。我只是希望在单元测试期间以某种方式将应用程序重定向到测试数据库。我怎么能完成这个?

有帮助吗?

解决方案

我通常做的是创建一个配置部分,其中包含确定要使用哪个连接字符串的功能。

这是一个基本的例子:

static ConfigurationSettings
{
     static String ConnectionString
     {
        get
        {
           var result = "TESTCONNECTIONSTRING";
           if (ConfigurationManager.ConnectionStrings["SOMEKEY"] != null)
               result = ConfigurationManager.ConnectionStrings["SOMEKEY"];
           return result;
     }
}

这样,我不必担心如何连接到系统,您也可以在测试中覆盖此行为,以通过添加setter来实现您想要的效果。

我没有采用多配置文件路由的原因是我在测试套件(例如NUnit testrunner)中运行时无法使用配置文件。

其他提示

您的连接字符串是否来自配置文件?你能在单元测试中设置匹配的配置吗?

您可能很快就会了解到,由于多种原因,静态/共享代码在单元测试中被视为邪恶。其中一个原因是在单元测试期间很难更改值。

Dependencies 明确传递给您的被测系统(SUT)更好一点 - 最好是在构造函数中。在您的情况下,您应该通过其构造函数将连接字符串传递给SUT。

更好的方法是抽象出接口后面的数据访问层,并将该接口的实例传递给SUT。

我写了一些关于势在必行的配置,但一般来说,你应该阅读Roy Osherove的书单元测试的艺术 - 它处理了很多这些问题。

将连接字符串保留在配置文件中是一种常见做法。如果你这样做,那么只需在不同的上下文中使用不同的配置文件。

如果您不这样做,也有可能(但您可能需要更改生产代码)。让连接字符串通过构造函数或setter注入。然后,在生产中,您使用生产连接字符串;在测试中,您可以连接到测试数据库。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top