nHibernate未在命令行上运行的MSTests中创建Oracle驱动程序

nHibernate未在命令行上运行的MSTests中创建Oracle驱动程序,nhibernate,command-line,oracle11g,mstest,Nhibernate,Command Line,Oracle11g,Mstest,我已经在这个问题上工作了几个星期了,我非常沮丧。因此,我将尽我所能提供所有信息,并希望一切顺利 我的团队正在构建一个新的应用程序。这是字母汤: .Net 4.5.1 nHibernate 4.0.0.4000和FluentNHibernate 2.0.3.0 Oracle 11g(Oracle.DataAccess 2.112.1.0,其复制本地设置为true) Visual Studio 2013是IDE Windows7专业版 我正在将该应用程序编译为32位应用程序,并已确认已安装32位

我已经在这个问题上工作了几个星期了,我非常沮丧。因此,我将尽我所能提供所有信息,并希望一切顺利

我的团队正在构建一个新的应用程序。这是字母汤:

  • .Net 4.5.1
  • nHibernate 4.0.0.4000和FluentNHibernate 2.0.3.0
  • Oracle 11g(Oracle.DataAccess 2.112.1.0,其复制本地设置为true)
  • Visual Studio 2013是IDE
  • Windows7专业版
我正在将该应用程序编译为32位应用程序,并已确认已安装32位版本的Oracle

我们已经为NHibernate映射编写了一些测试,我们通过MSTest运行这些映射。当我们通过VisualStudio的测试资源管理器运行这些测试时,它们都正常运行并通过了测试。应用程序本身也会按其应该的方式正确编译和部署。我们已经通过检查步骤之间的数据库来验证测试是否正常运行,因此我们非常确定测试本身不是问题所在

但是,当我们通过命令行运行MSTest时,会收到以下错误:

初始化方法MyTests。安装程序引发异常。NHibernate.HibernateException:NHibernate.HibernateException:无法从NHibernate.driver.OracleDataClientDriver创建驱动程序。-->System.Reflection.TargetInvocationException:调用的目标已引发异常。-->System.ArgumentException:找不到请求的.Net Framework数据提供程序。它可能没有安装

我尝试重新安装Oracle,但没有效果。我试着检查machine.config文件是否有错误(正如其他文章所建议的那样),但没有发现任何错误

我们的Fluent配置如下:

OracleDataClientConfiguration.Oracle10
    .ConnectionString(connectionString)
    .Driver("NHibernate.Driver.OracleDataClientDriver")
    .ShowSql()
    .FormatSql();
我在命令行上运行的代码如下:

(cd to the directory where the test .dll is)
>"C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\MSTest.exe" /testcontainer:MyTests.dll /test:UnitTests
我觉得我错过了一些东西。有什么想法吗


更新:找到解决方案

这是一个奇怪的例子。我遵循下面Fran的解决方案,安装了Oracle.ManagedDataAccess包,并将上面配置中的NHibernate驱动程序更改为NHibernate.driver.OracleManagedDataClient驱动程序。根据我们的快速评论讨论,这会导致一个新错误:

初始化方法MyTests。安装程序引发异常。NHibernate.HibernateException:NHibernate.HibernateException:无法从NHibernate.driver.OracleManagedDataClient创建驱动程序。-->System.Reflection.TargetInvocationException:调用的目标已引发异常。-->System.Configuration.ConfigurationErrorsException:未能找到或加载已注册的.Net Framework数据提供程序

然后Fran带我到了鼓励我逐件检查Oracle配置的地方。还有什么比创建测试更好的方法呢

var x = new OracleConnection(connectionString);
x.Open();
Assert.IsTrue(x.State == System.Data.ConnectionState.Open);
x.Close();
Assert.IsFalse(x.State == System.Data.ConnectionState.Open);
在快速尝试运行此测试时,我使用上面提到的脚本运行了整个UnitTests集合。瞧,每个测试都通过了! 在进行尽职调查时,请尝试以下方法

  • 我对该测试进行注释、清理、重建,然后再次运行脚本。失败
  • 我返回到旧的Oracle驱动程序,并在中添加新的测试。清理、重建、运行。失败
  • 重新添加新的Oracle驱动程序,确保新测试仍处于运行状态。运行新测试以外的测试。通行证

出于某种原因,新驱动程序和在测试中显式引用它的组合似乎解决了这个问题。我愿意接受任何关于原因的理论,但我敢打赌这是一个新问题。

我会停止使用oracle驱动程序的位特定版本,转而使用托管驱动程序()。它有点不可知,根本不需要您安装Oracle客户端

我实际上找到了问题的解决方案,这一切都与运行时如何加载
Oracle.DataAccess.dll
文件有关(披露:我在同一个项目上与wadeb合作)

除了Jenkins工作区中的build output文件夹外,服务器上的每个位置都在搜索Oracle.DataAccess.dll,因此从GAC中提取dll文件

用于查找DLL文件的文件路径之一是“当前可执行文件”所在的文件夹。在我们的例子中,“当前可执行文件”是
mstest.exe
。将Oracle.DataAccess.dll文件复制到
C:\ProgramFiles(x86)\Microsoft Visual Studio 12.0\Common7\IDE
中,成功了

成功了吗。对

是黑客吗?当然可以,但现在它不必升级到托管Oracle驱动程序即可工作


我们的服务器没有使用与托管驱动程序一起工作的Oracle客户端,在服务器升级之前,不允许出现中断的持续集成构建。

我遇到了同样的错误,我将测试切换到x64,现在它工作得很好:


我尝试了此操作,并收到以下新错误:
初始化方法MyTests。安装程序引发异常。NHibernate.HibernateException:NHibernate.HibernateException:无法从NHibernate.driver.OracleManagedDataClient创建驱动程序。-->System.Reflection.TargetInvocationException:调用的目标已引发异常。-->System.Configuration.ConfigurationErrorsException:未能找到或加载已注册的.Net Framework数据提供程序
我已确保将已配置的驱动程序更改为Oracle.ManagedDataClient驱动程序您的测试项目是否有一个app.config镜像您正在测试的项目的app.config或web.config?确实如此。我认为所有相关领域都是一样的。您是否希望出现特定的差异?ConfigurationsErrorsException告诉我配置有问题。检查这个问题,尽管这个问题并没有真正解决问题,但它确实导致了问题的解决。请看来函