我已经设置了一个测试数据库来开始对我最近添加到的应用程序进行单元测试。这是一个 3 层设计(表示层、BOL 和 DAL),这是我第一次编写单元测试。
我决定从 BOL 开始,我认为最好的方法是用指向我的新测试数据库的连接字符串(它已作为共享字符串传递)换掉。但是,我不想更改任何生产代码。我只是希望在单元测试期间以某种方式将应用程序重定向到测试数据库。我该怎么做呢?
我已经设置了一个测试数据库来开始对我最近添加到的应用程序进行单元测试。这是一个 3 层设计(表示层、BOL 和 DAL),这是我第一次编写单元测试。
我决定从 BOL 开始,我认为最好的方法是用指向我的新测试数据库的连接字符串(它已作为共享字符串传递)换掉。但是,我不想更改任何生产代码。我只是希望在单元测试期间以某种方式将应用程序重定向到测试数据库。我该怎么做呢?
我通常做的是创建一个配置部分,其中包含确定要使用哪个连接字符串的功能。
这是一个基本示例:
static ConfigurationSettings
{
static String ConnectionString
{
get
{
var result = "TESTCONNECTIONSTRING";
if (ConfigurationManager.ConnectionStrings["SOMEKEY"] != null)
result = ConfigurationManager.ConnectionStrings["SOMEKEY"];
return result;
}
}
这样,我就不必担心如何连接到系统,您也可以在测试中覆盖此行为,通过添加 setter 来完成您想要的。
我不走多配置文件路线的原因是我在测试套件(例如 NUnit 测试运行程序)中运行时无法使用配置文件。
您的连接字符串是否来自配置文件?您可以在单元测试中设置匹配的配置吗?
无论如何,您可能很快就会了解到,静态/共享代码在单元测试中被认为是邪恶的,原因有很多。这些原因之一是在单元测试期间很难更改值。
将您的依赖项显式传递给您的被测系统 (SUT) 是一个更好的主意- 最好是在构造函数中。在您的情况下,您应该通过其构造函数将连接字符串传递给 SUT。
更好的方法是抽象出接口后面的数据访问层,并将该接口的一个实例传递给 SUT。
我写过一些关于命令式配置的文章,但总的来说,你应该阅读 Roy Osherove 的书The Art of Unit Testing - 它处理了很多这样的问题。
将连接字符串保存在配置文件中是一种常见的做法。如果你这样做,那么只需在不同的上下文中使用不同的配置文件。
如果您不这样做,也有可能(但您可能必须更改生产代码)。让连接字符串通过构造函数或设置器注入。然后,在生产中,您使用生产连接字符串;在测试中,您可以连接到您的测试数据库。