具有[DeploymentItem]属性的数据驱动测试导致NHibernate出现OracleDataClientDriver错误(vstest.console.exe,Visual Studio 2013)

具有[DeploymentItem]属性的数据驱动测试导致NHibernate出现OracleDataClientDriver错误(vstest.console.exe,Visual Studio 2013),oracle,visual-studio,visual-studio-2013,nhibernate,vstest.console,Oracle,Visual Studio,Visual Studio 2013,Nhibernate,Vstest.console,我们有一些集成/单元测试来验证我们的NHibernate映射。我介绍了一些数据驱动测试,它们利用测试方法上方的[DeploymentItem]属性导入CSV文件。单元测试项目中的任何测试中仅存在此属性就会导致所有NHibernate映射测试失败,并显示以下消息: 无论是从命令行使用mstest.exe还是vstest.console.exe,我都会遇到相同的故障 在Visual Studio 2013中从“测试资源管理器”运行测试效果很好。从命令行运行测试失败,这是我们的持续集成服务器的一个问题

我们有一些集成/单元测试来验证我们的NHibernate映射。我介绍了一些数据驱动测试,它们利用测试方法上方的
[DeploymentItem]
属性导入CSV文件。单元测试项目中的任何测试中仅存在此属性就会导致所有NHibernate映射测试失败,并显示以下消息:

无论是从命令行使用
mstest.exe
还是
vstest.console.exe
,我都会遇到相同的故障

在Visual Studio 2013中从“测试资源管理器”运行测试效果很好。从命令行运行测试失败,这是我们的持续集成服务器的一个问题

因此,其他信息:

  • 这是VisualStudio中的一个单元测试项目
  • 只有在我不运行带有
    [DeploymentItem]
    属性的测试时,
    Oracle.DataAccess.dll
    文件才位于生成输出目录中(并且“Copy Local”设置为“True”)
  • 运行至少一个用
    [DeploymentItem]
    属性修饰的测试时,
    Oracle.DataAccess.dll
    文件不会复制到输出目录
  • 所有CSV文件的“复制到输出”属性设置为“始终”
  • Visual Studio 2013
  • NHibernate版本4.0.4.4000
  • .NET 4.5.1
  • FluentNHibernate版本2.0.3.0
  • Oracle client 12c安装在我的计算机上(12.1.0)

更新#1:我查看了
TestResults//Out
目录,没有看到Oracle.DataAccess.dll文件


更新#2:我们进行了一项测试,可以直接使用Oracle客户端库打开到Oracle数据库的连接。我在这个测试上面添加了一个[DeploymentItem]属性,它引用了Oracle.DataAccess.dll文件。现在NHibernate映射测试通过了,但是数据驱动测试没有加载CSV文件

[TestClass]
公共类OracleConnectionTests
{
[测试方法]
[TestProperty(“数据映射”、“连接测试”)]
[DeploymentItem(@.\Dependencies\Oracle.DataAccess.dll”)]
公共连接无效()
{
OracleConnection oraConn=新的OracleConnection(“此处为连接字符串”);
oraConn.Open();
Assert.IsTrue(oraConn.State==ConnectionState.Open);
oraConn.Close();
Assert.IsFalse(oraConn.State==ConnectionState.Open);
}
}
样本数据驱动测试:

[TestClass]
公共类FixedPrologueTests
{
私有常量字符串数据\u PROVIDER=“Microsoft.VisualStudio.TestTools.DataSource.CSV”;
私有常量字符串数据文件路径=@“\UnitTests\ViewModelTests\FixedPrologueTestData.csv”;
私有常量字符串数据输出路径=@“UnitTests\ViewModelTests”;
private const string DATA_TABLE_NAME=“FixedPrologueTestData.csv”;
公共TestContext TestContext{get;set;}
私有分页PrologueTestData数据;
私人分页序言序言;
private System.Collections.Generic.IEnumerable尾声;
[测试初始化]
公共作废设置()
{
数据=新分页PrologueTestData(TestContext.DataRow);
序言=新分页序言(data.Padding、data.CurrentPage、data.TotalPages);
尾声=序言。CreateEpilogue();
}
[测试方法]
[TestProperty(“分页序言”,“序言在接近结果集末尾时保持固定”)]
[数据源(数据提供程序、数据文件路径、数据表名称、DataAccessMethod.Sequential)]
[DeploymentItem(数据\文件\路径、数据\输出\路径)]
不包括结果集的结尾时的公共无效()
{
AreEqual(data.EpilogueLength,epilogue.Count());
}

如何包括[DeploymentItem]属性,以允许数据驱动测试加载CSV文件,并允许NHibernate在从命令行运行测试时加载Oracle驱动程序?

我最后用编译器标志“修复”了此问题:

[TestMethod]
[TestProperty(“分页序言”,“序言在接近结果集末尾时保持固定”)]
[数据源(数据提供程序、数据文件路径、数据表名称、DataAccessMethod.Sequential)]
#如果部署测试数据
[DeploymentItem(数据\文件\路径、数据\输出\路径)]
#恩迪夫
不包括结果集的结尾时的公共无效()
{
AreEqual(data.EpilogueLength,epilogue.Count());
}

由于此错误仅在我们的构建服务器上运行自动测试时发生,因此这是一个足够好的修复方法。老实说,我仍然不确定为什么会发生此错误,我只知道它会发生。它已经运行了3年多,情况相当稳定。

NHibernate处理Oracle驱动程序依赖项。如果无法找到它们,它将失败,正如您所看到的那样。您知道吗ve以确保程序集位于应用程序输出目录(如果相关,具有足够的位)或GAC中。@Frédéric:Oracle程序集将包含在输出目录中,直到您运行带有
[DeployementItem]注释的测试为止
属性。那么Oracle程序集不会被复制到输出目录,尽管Visual Studio中的“Copy Local”属性设置为“True”@Frédéric:我已经用这些信息更新了我的问题。我以前以为我已经包含了它,但我没有。这是一个非常奇怪的问题。我不知道为什么使用该属性运行测试会从输出中删除内容。因为它是一个动态加载的程序集,你可以将其从引用中删除,并简单地将其添加为带有复制到输出目录选项,以检查是否有任何更改。否则,将添加它并使用应用程序配置文件中的
元素指定程序集的全名。或者添加一个以从其他地方加载它。
Error Message:
   Initialization method UnitTests.SearchOrganizationTests.Setup threw exception. NHibernate.HibernateException: NHibernate.HibernateException: Could not create the driver from NHibernate.Driver.OracleDataClientDriver. ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object..
Stack Trace:
    at NHibernate.Driver.OracleDataClientDriver..ctor()
 --- End of inner exception stack trace ---
    at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
   at System.Activator.CreateInstance(Type type, Boolean nonPublic)
   at System.Activator.CreateInstance(Type type)
   at NHibernate.Bytecode.ActivatorObjectsFactory.CreateInstance(Type type)
   at NHibernate.Connection.ConnectionProvider.ConfigureDriver(IDictionary`2 settings)
 --- End of inner exception stack trace ---
    at NHibernate.Connection.ConnectionProvider.ConfigureDriver(IDictionary`2 settings)
   at NHibernate.Connection.ConnectionProvider.Configure(IDictionary`2 settings)
   at NHibernate.Connection.ConnectionProviderFactory.NewConnectionProvider(IDictionary`2 settings)
   at NHibernate.Cfg.SettingsFactory.BuildSettings(IDictionary`2 properties)
   at NHibernate.Cfg.Configuration.BuildSettings()
   at NHibernate.Cfg.Configuration.BuildSessionFactory()
   at MyApplication.DataContext.get_SessionFactory()
   at MyApplication.DataContext.GetClassMetadata(Type type)
   at MyApplication.DataContext.GetClassMetadata[T]()
   at MyApplication.DataContext.GetTableName[T]()