1

我正在开发一个相当成熟的 ASP.NET MVC 应用程序。我们已经掌握了一组服务背后的核心逻辑,并且我们正在使用 StructureMap 来注入适当的 IRepositories 的适当实例,以抽象与数据层适当的通信。我们还对这些服务进行了一系列相当详尽的单元测试。但是,就目前的情况而言,单元测试与一组使用内存对象图来表示数据库的假存储库进行通信。

我想做的是找到一种使用由数据库和我们的 Linq2Sql 存储库支持的同一组测试的好方法。现在,我可以看到使用#if() 编译器指令和一些标志来完成此任务的绝妙方法,但我怀疑有更好的方法可以实现。有什么建议么?

编辑:

詹姆斯回答了最初的问题,但他也让我意识到我不太清楚我的目标是什么。

我想做的是让这个出现,至少对于测试运行器(目前是 Gallio)来说,它是两个单独的程序集。主要原因是我可以分别运行单元测试和集成测试,避免完全依赖数据库。

4

2 回答 2

2

当然,只需将参数添加到 AssemblyFixture。

[AssemblyFixture] 公共类 AssemblyStartup { [Row("in-memory-database-connection-string")] [Row("real-database-connection-string")] 公共字符串 ConnectionString;

[FixtureSetUp]
public void SetUp()
{
    ... set up my repositories using ConnectionString above...
}

}

将会发生的情况是,所有的夹具和装配夹具 Setup() 将每次使用不同的 ConnectionString 值运行两次。

于 2009-06-05T18:57:09.180 回答
0

作为一种廉价的 hack,您始终可以创建程序集的单独副本,然后根据程序集的位置决定使用哪个存储库。不是一个很好的解决方案。

在使用真实 Db 或使用假 Db 时,可能会发生某些测试没有意义的情况。所以我有时在这种情况下做的是创建项目文件的副本(在同一个文件夹中),然后使用预处理器符号和#if / #endif 有条件地包含每个项目的不同部分。

这种方法的主要问题是这两个项目会随着时间的推移而趋于分歧,除非您小心地同步项目结构的重要更改,例如确保包含任何新添加的文件。

在 Gallio 的未来版本中,将有一个从外部传入参数的功能。这样,您就可以在同一个程序集中拥有一个假的 Db“测试配置文件”和一个真正的 Db“测试配置文件”。

现在模拟“测试配置文件”的一种方法是使用环境变量从外部将信息传递给测试。只需在运行测试之前设置环境变量并从测试程序集中读取它。如果未设置环境变量,则可以交互提示用户。(当然一定要在构建服务器上设置环境变量!)

于 2009-06-05T21:48:56.493 回答