gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:46:15 25 4
gpt4 key购买 nike

我在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com