【问题标题】:NET 5 MsTest Aborts on Interop testsNET 5 MsTest 在互操作测试中中止
【发布时间】:2022-01-26 00:58:10
【问题描述】:

几个小时以来,我一直在与 Interop 单元测试中的一个奇怪的 MsTest 问题作斗争。上下文是 Windows11、NET 5、VStudio 2019 和 2022,以及与 Office Apps Access、Excel、Word、Outlook 和 PowerPoint 的互操作。

所有项目和测试项目 .csproj 文件都设置为 TFM net5.0-windows7.0。部分项目导入Microsoft.Office.Core,所有项目导入各自的Interop库如Microsoft.Office.Interop.Excel等。

问题在于,某些应用程序的测试工作正常,而对于其他应用程序,测试框架在单击测试方法名称旁边的测试按钮后立即中止(没有我可以看到或找到的异常或错误消息)。

观察到的东西:

  1. 测试框架在中止时将测试报告为不确定。 (我说“中止”,但测试只是立即完成且不确定,没有崩溃或错误消息。我认为测试永远不会运行。有时白色的小调试圆圈出现在断点处,就好像调试器要很快就停在那里,但它永远不会到达那里。)

  2. 有时(并非总是)单元测试窗口在using Microsoft.Office.Interop.Excel 中以红色显示“互操作”,就好像它找不到 COM 程序集一样。

  3. 有时(并非总是)单元测试代码会在Excel.Applicationvar myrange = sheet.Range["A9","C9"] 中以红色显示“Application”或“ActiveWindow”或“Range”(或其他一些二级对象名称),好像它可以一样” t 找到定义。

  4. 例如,我尝试在这个小测试的第 2 行和第 3 行设置调试断点,但从未到达断点。测试框架会中止/跳过。

    [TestMethod]
    public void Simple() {
      var foo = 2;
    }
    
    
  5. 所有五个办公应用程序都使用相同的项目文件内容和包(除了它们为 Excel、Office、Outlook 等导入自己的互操作库)

  6. 问题仅出现在三个应用程序上,并且由于某种原因在两个应用程序上消失了。我现在正在使用 Excel,这就是为什么我的示例适用于 Excel。 Word 测试项目很不稳定,有时会显示问题,有时不会。 Outlook、Access 和 Powerpoint 的单元测试都运行良好。 (如果他们之前展示过这个问题,它已经消失了。)

  7. 所有代码、测试等都在 NET Framework 4.8 上完美运行了将近两年。

  8. 我为这些 Office 项目(仅在 VS2019 上)收到的唯一编译警告类似于我的 Excel 项目中显示的以下警告。但它们似乎与我的代码无关且遥远。

特殊 VS2022 观察

  1. VS2022 不显示警告信息,但仍有中止问题。它看起来像一个完全干净的“构建成功”报告。

  2. VS2022 不显示红色的“互操作”或“范围”或“应用程序”无法识别的对象消息,如上所述。

  3. 然而 VS2022 仍然像 VS2019 一样中止测试。

来自我使用 VS2019 的 Excel 单元测试项目:

严重性代码描述项目文件行抑制状态 警告 MSB3305 从路径“C:\Program Files\Microsoft Office\Root\VFS\ProgramFilesCommonX86\Microsoft Shared\OFFICE16\MSO.DLL”处理 COM 引用“Microsoft.Office.Core”。类型库导入器遇到类型“Microsoft.Office.Core.SeriesGradientStopColorFormat”的属性获取器“Type”,但没有有效的返回类型。导入器将尝试将此属性作为方法导入。 HspoExcelTests C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets 2827

来自我使用 VS2019 的 Excel 代码项目:

严重性代码描述项目文件行抑制状态 警告 MSB3305 从路径“C:\Program Files\Microsoft Office\Root\VFS\ProgramFilesCommonX86\Microsoft Shared\OFFICE16\MSO.DLL”处理 COM 引用“Microsoft.Office.Core”。类型库导入器遇到类型“Microsoft.Office.Core.SeriesGradientStopColorFormat”的属性获取器“Type”,但没有有效的返回类型。导入器将尝试将此属性作为方法导入。 HspoExcel C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets 2827

从我的 Excel 代码项目(它在一两个地方调用 Word 互操作)使用 VS2019:

严重性代码描述项目文件行抑制状态 警告 MSB3305 处理来自路径“C:\Program Files\Microsoft Office\Root\Office16\MSWORD.OLB”的 COM 引用“Microsoft.Office.Interop.Word”。类型库导入程序在类型“Microsoft.Office.Interop.Word._Document”上遇到了一个属性获取器“Dummy1”,但没有有效的返回类型。导入器将尝试将此属性作为方法导入。 HspoExcel C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets 2827

Excel 测试项目的 .csproj 文件示例:

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFramework>net5.0-windows7.0</TargetFramework>
        <IsPackable>false</IsPackable>
    </PropertyGroup>

    <ItemGroup>
      <COMReference Include="Microsoft.Office.Core">
        <WrapperTool>tlbimp</WrapperTool>
        <VersionMinor>8</VersionMinor>
        <VersionMajor>2</VersionMajor>
        <Guid>2df8d04c-5bfa-101b-bde5-00aa0044de52</Guid>
        <Lcid>0</Lcid>
        <Isolated>false</Isolated>
        <EmbedInteropTypes>true</EmbedInteropTypes>
      </COMReference>
      <COMReference Include="Microsoft.Office.Interop.Excel">
        <WrapperTool>tlbimp</WrapperTool>
        <VersionMinor>9</VersionMinor>
        <VersionMajor>1</VersionMajor>
        <Guid>00020813-0000-0000-c000-000000000046</Guid>
        <Lcid>0</Lcid>
        <Isolated>false</Isolated>
        <EmbedInteropTypes>true</EmbedInteropTypes>
      </COMReference>
    </ItemGroup>

    <ItemGroup>
      <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.0.0" />
      <PackageReference Include="MSTest.TestAdapter" Version="2.2.8" />
      <PackageReference Include="MSTest.TestFramework" Version="2.2.8" />
    </ItemGroup>


    <ItemGroup>
      <ProjectReference Include="..\HspoExcel\HspoExcel.csproj" />
    </ItemGroup>

    <ItemGroup>
        <Reference Include="HsUtils">
            <HintPath>..\..\..\Holding\core.plt\HsUtils.dll</HintPath>
        </Reference>
        .. other normal libraries (2) that are referenced
    </ItemGroup>

</Project>

有谁知道发生了什么以及我可以做些什么来解决这个问题并在 NET 5 平台上获得更高的可靠性?

【问题讨论】:

    标签: c# visual-studio unit-testing interop .net-5


    【解决方案1】:

    经过更多小时的调查,结果发现问题出在 NET 5 项目的 Resharper 测试运行器上。该问题适用于多种项目(互操作和非互操作)。

    在所有情况下,Microsoft VS 测试资源管理器都可以 1) 显示代码,其中没有指示缺少对象类型的红字,以及 2) 正确运行测试代码。

    我的教训是学会尝试在下一次尽快切换测试运行器,而不是浪费太多时间在可以通过使用不同的测试运行器轻松绕过的基础设施问题上。如果有人在 NET 5 和 Resharper 上遇到同样的问题,希望这个故事能为他们节省一些时间。

    【讨论】:

      猜你喜欢
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多