我对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" />
现在我希望我明白为什么...... :)。
答案 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;
}