8

问题:在我的 DAL 程序集中引用的 SQLite 程序集在进行单元测试时不会被复制到输出文件夹(复制本地设置为true)。

我正在 VS2008 中开发一个 .Net 3.5 应用程序,在我的 DAL 中使用 NHibernate 和 SQLite。数据访问通过 IRepository 接口(存储库工厂)暴露给其他层,因此不需要引用NHibernateSystem.Data.SQLite其他层中的程序集。

对于单元测试,有一个公共工厂方法(也在我的 DAL 中),它创建一个内存 SQLite 会话并创建一个新的 IRepository 实现。这样做也是为了避免为所有需要它的程序集提供共享的 SQLite 内存配置,并避免引用那些 DAL 内部程序集。

问题是当我运行驻留在单独项目中的单元测试时 - 如果我不添加System.Data.SQLite作为对单元测试项目的引用,它不会被复制到 TestResults...\Out 文件夹(尽管这个项目引用了我的DAL 项目,它引用System.Data.SQLite,其 Copy local 属性设置为true),因此在配置 NHibernate 时测试失败。如果我将引用添加到我的测试项目,那么它确实会被复制并且单元测试可以工作。

我究竟做错了什么?

[更新]

似乎我在这里找到了答案:TFS UnitTesting not deploying local copy assembly to test dir when on build server。如果我在 DAL 的某个静态方法中添加对该类型的引用,当我在测试中引用 DAL 程序集时,它将自动复制。这看起来确实像一个黑客,但恕我直言,它比拥有单独的脚本更干净,因为它创建了一个“真正的”依赖项。

如果我将 SQLite 程序集作为附加部署项添加到我的测试运行配置(LocalTestRun.testrunco​​nfig 文件)中,它似乎也会被复制。

感谢您的快速回答!

4

2 回答 2

7

您的 DAL 项目引用了System.Data.SQLite程序集,但这并不意味着它将被复制到测试项目的输出文件夹中,特别是如果它是由 NHibernate 使用反射加载的。如果您使用反射器查看已编译的 DAL 程序集,它甚至不会在引用的程序集列表中包含它,因为它不是由代码直接使用的。您已经通过引用单元测试项目找到了解决方案。

于 2010-04-27T07:04:25.410 回答
1

您可以使用 Post-build 步骤手动将 dll 复制到您的输出文件夹。

于 2010-04-27T07:06:46.283 回答