【发布时间】: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等。
问题在于,某些应用程序的测试工作正常,而对于其他应用程序,测试框架在单击测试方法名称旁边的测试按钮后立即中止(没有我可以看到或找到的异常或错误消息)。
观察到的东西:
-
测试框架在中止时将测试报告为不确定。 (我说“中止”,但测试只是立即完成且不确定,没有崩溃或错误消息。我认为测试永远不会运行。有时白色的小调试圆圈出现在断点处,就好像调试器要很快就停在那里,但它永远不会到达那里。)
-
有时(并非总是)单元测试窗口在
using Microsoft.Office.Interop.Excel中以红色显示“互操作”,就好像它找不到 COM 程序集一样。 -
有时(并非总是)单元测试代码会在
Excel.Application或var myrange = sheet.Range["A9","C9"]中以红色显示“Application”或“ActiveWindow”或“Range”(或其他一些二级对象名称),好像它可以一样” t 找到定义。 -
例如,我尝试在这个小测试的第 2 行和第 3 行设置调试断点,但从未到达断点。测试框架会中止/跳过。
[TestMethod] public void Simple() { var foo = 2; } -
所有五个办公应用程序都使用相同的项目文件内容和包(除了它们为 Excel、Office、Outlook 等导入自己的互操作库)
-
问题仅出现在三个应用程序上,并且由于某种原因在两个应用程序上消失了。我现在正在使用 Excel,这就是为什么我的示例适用于 Excel。 Word 测试项目很不稳定,有时会显示问题,有时不会。 Outlook、Access 和 Powerpoint 的单元测试都运行良好。 (如果他们之前展示过这个问题,它已经消失了。)
-
所有代码、测试等都在 NET Framework 4.8 上完美运行了将近两年。
-
我为这些 Office 项目(仅在 VS2019 上)收到的唯一编译警告类似于我的 Excel 项目中显示的以下警告。但它们似乎与我的代码无关且遥远。
特殊 VS2022 观察
-
VS2022 不显示警告信息,但仍有中止问题。它看起来像一个完全干净的“构建成功”报告。
-
VS2022 不显示红色的“互操作”或“范围”或“应用程序”无法识别的对象消息,如上所述。
-
然而 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