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

标签 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:... 运行它,那么我的测试将失败,异常(exception)情况是:

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" />

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

最佳答案

在这里回答我自己的问题,但我终于想通了:

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

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

关于unit-testing - MSTest.exe 无法加载 ADO.NET 数据提供程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3736614/

相关文章:

ios - Xcode 单元测试 - 无法添加新测试,因为它没有运行

unit-testing - 如何确认我使用的 Jasmine 版本是什么?

java - RESTEasy 有客户端模拟框架吗?

c# - 这两个单元测试断言有什么区别?

c# - Nfluent 仅检查对象的少数成员

unit-testing - 伪造、 mock 和 stub 有什么区别?

c# - 为什么通过 ADO.NET 执行的存储过程花费的时间比 SQL Server Management Studio 长很多倍?

c# - 什么更好 : DataSet or DataReader?

c# - 通过 ADO.Net 命令调用 Informix 存储过程的最佳/正确方法?

visual-studio - 运行所有测试时出现MS Test错误