【问题标题】:Azure DevOps pipeline unit tests with library dependency not working具有库依赖项的 Azure DevOps 管道单元测试不起作用
【发布时间】:2020-05-26 16:24:01
【问题描述】:

如果一个 C# 项目的单元测试使用 MS fakes 和 .dll 中的第 3 方库,我将引用为 X。在我的单元测试项目中,.dll 在本地引用并打包在 Azure吉特。现在,当使用 MS 托管代理通过 Azure DevOps 管道构建解决方案时,一切正常,但单元测试在每次测试中都会失败。

单元测试yaml如下:

- task: VSTest@2
  inputs:
    testSelector: 'testAssemblies'
    testAssemblyVer2: |
      **\*UnitTests*.dll
      !**\*TestAdapter.dll
      !**\obj\**
    searchFolder: '$(System.DefaultWorkingDirectory)'

错误:

System.IO.FileNotFoundException:无法加载文件或程序集“Y,版本=4.0.0.0,Culture=neutral,PublicKeyToken=...”或其依赖项之一。系统找不到指定的文件。

Y 是另一个.dll,我假设第一个库依赖于它,尽管使用dumpbin /dependents X.dll 不会显示它。我尝试将 Y 添加到项目中作为参考,产生相同的结果。我尝试使用以下 Powershell 脚本来添加它:

- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: |
      $dllpath = 'dll'
      $files = Get-ChildItem -Path $dllpath -Name
      [System.Reflection.Assembly]::Load("System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
      $publish = New-Object System.EnterpriseServices.Internal.Publish
      Foreach ($file in $files)
      {
        $publish.GacInstall($dllpath + "\" + $file)
      }

将错误更改如下:

System.Runtime.InteropServices.COMException:检索具有 CLSID {...} 的组件的 COM 类工厂失败,原因是以下错误:80040154 未注册类(来自 HRESULT 的异常:0x80040154 (REGDB_E_CLASSNOTREG))。

我已经在线检查了错误,但找不到任何解决问题的方法。

有人知道如何让单元测试在 MS Agent 上运行吗?

【问题讨论】:

    标签: unit-testing dll azure-devops azure-pipelines


    【解决方案1】:

    我尝试将 Y 添加到项目中作为参考,得到相同的结果。

    在单元测试项目中添加Y时,确保项目文件中dll文件的路径为相对路径

      <ItemGroup>
        <Reference Include="Y">
          <HintPath>..\Y.dll</HintPath>
        </Reference>
      </ItemGroup>
    

    并确认属性Copy Local设置为True

    将错误更改如下:...

    似乎 dll 是在 32/64 位版本的 Windows 注册表上注册的,但应用程序使用的是不同的位版本。尝试根据您的系统将您的项目构建属性平台目标从Any CPU 更改为x86x64,这可能会解决问题。

    查看the similar thread了解更多详情。

    希望这会有所帮助。

    【讨论】:

    • 在我最初的尝试中,我已经将带有提示路径的引用添加到本地实例,导致相同的错误。我还尝试将构建配置显式更改为 x86 和 x64;也都产生相同的错误。
    • @404,感谢您的回复。请分享您的HintPath for Y.dll,以及构建后单元测试项目输出中的 y.dll 吗?您可以使用复制任务并发布构建工件来输出 bin 文件夹以进行检查。
    • 我可以在我的存储库中看到 dll。我检查了构建输出,确实没有包含 dll。在我的项目中,我将Embed interop types 更改为false,将Copy local 更改为true。然而,结果与 OP 中提到的 System.Runtime.InteropServices.COMException 相同。
    • @404,谢谢您的回复。所以,您已经解决了第一个错误,无法加载文件或程序集?还有第二个错误System.Runtime.InteropServices.COMException?当您在本地没有 azure devops 的情况下构建它时,结果如何?此错误应该与Azure devops无关,而与构建配置有关,在本地构建时检查构建配置,也可以共享。
    • 正确,第一个错误似乎已解决,但我仍然遇到第二个错误。如果我使用测试资源管理器在本地运行测试,它会通过 84 到 84。我还尝试在单元测试的构建 dll 上使用带有vstest.console.exe 的命令提示符,这也导致所有测试都通过。
    猜你喜欢
    • 2021-02-26
    • 2021-03-09
    • 2021-03-16
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    相关资源
    最近更新 更多