代码之家  ›  专栏  ›  技术社区  ›  CodingWithSpike

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

  •  2
  • CodingWithSpike  · 技术社区  · 15 年前

    我对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.
    

    奇怪的是,如果我查询dbproviderFactory类,我确实看到了我的“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条目之前清除了provider集合,因为如果它已经存在于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中,如果为程序集指定完整的/strong名称,则它在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 回复  |  直到 15 年前
        1
  •  3
  •   CodingWithSpike    15 年前

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

    我的oracle.dataaccess.dll最终会出现在我的\bin\debug文件夹中。但是,当mstest.exe运行时,它不会将该.dll复制到实际运行测试的新文件夹中。出于某种原因,它复制了另外30个文件,但不是那个?

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

        2
  •  0
  •   Tomasz Jakub Rup    9 年前

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

    [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;
    }