有没有什么好方法可以使用两个不同的AssemblyStartup运行一组测试

时间:2009-06-05 13:33:59

标签: .net asp.net-mvc tdd mbunit

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

我想要做的是找到一种使用数据库和Linq2Sql存储库支持的同一组测试的好方法。现在,我可以看到使用#if()编译器指令和一些标志来实现这一点的非常好的方法,但我怀疑有更好的方法来实现。有什么建议吗?

编辑:

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

我想要做的是,至少对于测试运行者(目前是Gallio)来说,这是两个独立的组件。主要原因是我可以单独运行单元测试和集成测试,避免完全依赖DB。

2 个答案:

答案 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“测试配置文件”。

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