我正在开发一个非常标准的ASP.NET MVC应用程序。我们已经获得了一组服务背后的核心逻辑,我们正在使用StructureMap注入适当的IRepositories的适当实例来抽象与数据层的通信。我们还对这些服务进行了相当详尽的单元测试。但是,就目前而言,单元测试使用内存中的对象图来表示数据库,与一组假存储库进行对话。
我想要做的是找到一种使用数据库和Linq2Sql存储库支持的同一组测试的好方法。现在,我可以看到使用#if()编译器指令和一些标志来实现这一点的非常好的方法,但我怀疑有更好的方法来实现。有什么建议吗?
编辑:
詹姆斯回答了原来的问题,但他也让我意识到我不太清楚我的目标是什么。
我想要做的是,至少对于测试运行者(目前是Gallio)来说,这是两个独立的组件。主要原因是我可以单独运行单元测试和集成测试,避免完全依赖DB。
答案 0 :(得分:2)
当然,只需将参数添加到AssemblyFixture即可。
[AssemblyFixture] 公共类AssemblyStartup { [行(“内存数据库连接字符串”)] [行(“实时数据库连接字符串”)] public string ConnectionString;
[FixtureSetUp]
public void SetUp()
{
... set up my repositories using ConnectionString above...
}
}
将会发生的是,每次使用不同的ConnectionString值,所有灯具和装配夹具Setup()都将运行两次。
答案 1 :(得分:0)
作为一个廉价的黑客,你总是可以创建一个单独的程序集副本,然后根据程序集的位置决定使用哪个存储库。不是一个好的解决方案。
当使用真正的Db或使用假Db时,某些测试可能会有意义。所以我在这种情况下有时会创建一个项目文件的副本(在同一个文件夹中),然后使用预处理器符号和#if / #endif有条件地包含每个项目的不同部分。
这种方法的主要问题在于,除非您小心地将重要更改与项目结构同步,例如确保包含任何新添加的文件,否则这两个项目将随着时间的推移而出现分歧。
在未来的Gallio版本中,将有一个从外部传递参数的功能。这样你就可以在同一个组件中拥有一个假的Db“测试配置文件”和一个真正的Db“测试配置文件”。
现在模拟“测试配置文件”的一种方法是使用环境变量将信息从外部传递给测试。只需在运行测试之前设置环境变量,然后从测试程序集中读取它。如果未设置环境变量,则可以交互式提示用户。 (当然一定要在构建服务器上设置环境变量!)