.net SQLite程序集未复制到单元测试的输出文件夹

.net SQLite程序集未复制到单元测试的输出文件夹,.net,unit-testing,nhibernate,system.data.sqlite,.net,Unit Testing,Nhibernate,System.data.sqlite,问题:my DAL程序集中引用的SQLite程序集在执行单元测试时未复制到输出文件夹(Copy local设置为true) 我正在VS2008中开发一个.NET3.5应用程序,我的DAL中有NHibernate和SQLite。数据访问通过IRepository接口(repository factory)公开给其他层,因此不需要引用其他层中的NHibernate或System.Data.SQLite程序集 对于单元测试,有一个公共工厂方法(也在我的DAL中),它创建内存中的SQLite会话并创建一

问题:my DAL程序集中引用的SQLite程序集在执行单元测试时未复制到输出文件夹(Copy local设置为
true

我正在VS2008中开发一个.NET3.5应用程序,我的DAL中有NHibernate和SQLite。数据访问通过IRepository接口(repository factory)公开给其他层,因此不需要引用其他层中的
NHibernate
System.Data.SQLite
程序集

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

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

我做错了什么

[更新]

似乎我在这里找到了答案:。如果我在DAL中的某个静态方法中添加对该类型的引用,它将在我在测试中引用DAL程序集时自动复制。这看起来确实像是一个黑客攻击,但IMHO是一个比使用单独脚本更干净的解决方案,因为它创建了“真正的”依赖关系

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


感谢您的快速回答!

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

您可以使用生成后步骤手动将dll复制到输出文件夹。

或者您可以将其添加到Nant或等效的生成脚本中,以复制到所需的程序集上作为预测试谢谢,但实际上我不想在我的业务层测试中引用特定的数据程序集,这感觉不对。我不会太担心单元测试引用的程序集是什么。如果被引用的程序集不包括在编译的DAL程序集中,那么引用DAL的任何程序集都不会获得此程序集包括在他们的输出文件夹中,因此这不仅仅局限于单元测试。这可能只是一个小麻烦,因为我可以轻松地将所有程序集复制到单个目标文件夹中,但在项目中引用此程序集来解决此问题的所有方法似乎都不是最干净的解决方案。它看起来就像DALs有责任确保这一点。我也有同样的问题,NHibernate.ByteCode.Castle dll没有被复制,因为它只从配置文件中引用,并由NHibernate动态加载。我只是在测试项目中创建了对该dll中一个类的引用,并导致它被部署。任何操作都可以:
var factory=new NHibernate.ByteCode.Castle.proxyFactory();