MSTest.exe无法加载ADO.NET数据提供程序?

时间:2010-09-17 15:16:51

标签: unit-testing ado.net mstest

我对MSTest有一个非常奇怪的问题。我有一个更多的集成测试测试,需要连接到数据库。它通过调用以下方式获取ADO.NET数据提供程序工厂来实现此目的:

var factory = DbProviderFactories.GetFactory("Oracle.DataAccess.Client");

在我的app.config文件中,我有:

<system.data>
  <DbProviderFactories>
    <add name="Oracle Data Provider" invariant="Oracle.DataAccess.Client" description=".Net Framework Data Provider for Oracle" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess" />

这个非常好用,如果我在Visual Studio中运行它,测试就会通过。但是,如果我打开命令提示符,并使用MSTest.exe /testcontainer:...运行它然后我的测试失败,但例外:

System.Configuration.ConfigurationErrorsException
Message:  Failed to find or load the registered .Net Framework Data Provider.

奇怪的是,如果我查询DBProviderFacotry类,我确实看到了我的“Oracle.DataAccess.Client”提供程序,但是尝试实际获取它的实例会引发异常:

var name = DbProviderFactories.GetFactoryClasses().Rows[1]["InvariantName"]; // returns "Oracle.DataAccess.Client"
var fact = DbProviderFactories.GetFactory("Oracle.DataAccess.Client"); // throws exception

同样,从MSTest.exe命令行运行时,此失败,并且在VisualStudio 2008中正常工作。任何人都有任何想法?


更新

我发现了另一个有趣的细节...在我的app.config中,我实际上在添加我的oracle条目之前清除了提供者集合,因为如果它已经存在于machine.config中,则会导致错误:

<system.data>
  <DbProviderFactories>
    <clear />
    <add name="Oracle Data Provider" invariant="Oracle.DataAccess.Client" description=".Net Framework Data Provider for Oracle" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess" />

现在,我刚刚发现,如果我从app.config中完全删除它,并且根本没有指定DbProviderFactories,那么它工作正常!

...奇怪


更新2

好吧,我想我有点想通了。在我的app.config中,如果我指定程序集的完整/强名称,那么它在VisualStudio和命令行中都有效:

<add name="Oracle Data Provider"
  invariant="Oracle.DataAccess.Client"
  description="Oracle Data Provider for .NET" 
  type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=2.111.7.20, Culture=neutral, PublicKeyToken=89b483f429c47342" />

但短名称仅适用于VisualStudio,而不适用于命令行:

<add name="Oracle Data Provider"
  invariant="Oracle.DataAccess.Client"
  description=".Net Framework Data Provider for Oracle"
  type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess" />

现在我希望我明白为什么...... :)。

2 个答案:

答案 0 :(得分:3)

在这里回答我自己的问题,但我终于弄明白了:

当VisualStudio构建它时,我的Oracle.DataAccess.dll最终会在我的\ bin \ Debug文件夹中。但是,当MSTest.exe运行时,它不会将.dll复制到实际运行测试的新文件夹中。出于某种原因,它复制了其他30个文件,但不是那个文件?

无论如何,这就是为什么添加完整的程序集名称的原因;因为它可以从GAC而不是本地文件夹加载它。

答案 1 :(得分:0)

我可以使用以下代码修复此问题:

[ClassInitialize]
[AssemblyInitialize]
public static void InitTestSuite(TestContext testContext)
{
    // You use the capability for configuring the behavior of the EF-provider:
    var instanceSql = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
    var instanceOracle = Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices.Instance;
}