在 .Net 6.0 中使用 WinUI 3 的 C# MsTest 出现错误“处理资源失败,出现错误:重复条目”

C# MsTest with WinUI 3 in .Net 6.0 gives error "Processing Resources failed with error: Duplicate Entry"

提问人:Woz9 提问时间:11/17/2023 更新时间:11/20/2023 访问量:17

问:

我正在使用 C#、.Net 6.0、VS 2022 构建一个 WinUI 3 应用程序,我想使用 MsTest 添加单元测试,但当我尝试引用回要测试的项目时出现错误。在这种情况下是否可以使用 MsTest?有什么建议如何让它工作吗?

我能找到的最接近说明的是这篇博文

似乎无法将 MsTest 项目添加到解决方案中,而是必须添加 WinUI 3 项目的另一个 shell,并添加 nugets 和配置,以使其与 VS 单元测试框架集成。这些说明可以追溯到早期的 WinUI 3 开发,某些步骤似乎不再相关 (,例如合并 csproj 和 wapproj) 。

这些说明似乎在一定程度上有效 - 我可以创建出现在 VS 的“测试资源管理器”窗口中的基本单元测试。当我尝试创建从测试项目到要测试的项目的引用时,会出现此问题。在单元测试项目中添加引用后,当我尝试在单元测试应用中生成(或运行测试)时,会出现以下错误:

Severity    Code    Description     Project File    Line    Suppression State
Error       PRI277: 0x80073b0f - Conflicting values for resource 'Files/MainWindow.xbf' UnitTestProject D:\source\repos\MyApp\UnitTestProject\WINAPPSDKGENERATEPROJECTPRIFILE   1   
Error       PRI175: 0x80073b0f - Processing Resources failed with error: Duplicate Entry.   UnitTestProject D:\source\repos\MyApp\UnitTestProject\WINAPPSDKGENERATEPROJECTPRIFILE   1   

我不确定这些来自哪里或如何尝试调试。

我尝试从我的单元测试项目中删除默认资产 png 文件,看看它们是否与问题相关,错误更改为:

Severity    Code    Description      Project    File    Line    Suppression State
Error       PRI175: 0x80073b0f - Processing Resources failed with error: Duplicate Entry.   UnitTestProject D:\source\repos\MyApp\UnitTestProject\WINAPPSDKGENERATEPROJECTPRIFILE   1   
Error       PRI277: 0x80073b0f - Conflicting values for resource 'Files/App.xbf'    UnitTestProject D:\source\repos\MyApp\UnitTestProject\WINAPPSDKGENERATEPROJECTPRIFILE   1   

现在抱怨而不是App.xbfMainWindow.xbf

下面列出了我的单元测试项目的项目文件。我已确保 WindowsAppSDK 和 BuildTools 包与我要测试的项目中的版本相同。似乎无法使用博客说明中建议的测试环境包版本,因为它们现在已弃用。

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <OutputType>WinExe</OutputType>
        <TargetFramework>net6.0-windows10.0.19041.0</TargetFramework>
        <TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion>
        <RootNamespace>UnitTestProject</RootNamespace>
        <ApplicationManifest>app.manifest</ApplicationManifest>
        <Platforms>x86;x64;ARM64</Platforms>
        <RuntimeIdentifiers>win10-x86;win10-x64;win10-arm64</RuntimeIdentifiers>
        <PublishProfile>win10-$(Platform).pubxml</PublishProfile>
        <UseWinUI>true</UseWinUI>
        <EnableMsixTooling>true</EnableMsixTooling>
        <WindowsPackageType>None</WindowsPackageType>
    </PropertyGroup>

    <ItemGroup>
        <ProjectCapability Include="TestContainer" />
    </ItemGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.TestPlatform.TestHost" Version="17.8.0">
            <ExcludeAssets>build</ExcludeAssets>
        </PackageReference>
        <PackageReference Include="Microsoft.Windows.Compatibility" Version="8.0.0" />
        <PackageReference Include="Microsoft.WindowsAppSDK" Version="1.4.231115000" />
        <PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.22621.2428" />
        <PackageReference Include="MSTest.TestAdapter" Version="3.1.1" />
        <PackageReference Include="MSTest.TestFramework" Version="3.1.1" />
        <Manifest Include="$(ApplicationManifest)" />
    </ItemGroup>

    <!-- 
    Defining the "Msix" ProjectCapability here allows the Single-project MSIX Packaging
    Tools extension to be activated for this project even if the Windows App SDK Nuget
    package has not yet been restored.
  -->
    <ItemGroup Condition="'$(DisableMsixProjectCapabilityAddedByProject)'!='true' and '$(EnableMsixTooling)'=='true'">
        <ProjectCapability Include="Msix" />
    </ItemGroup>
    <ItemGroup>
      <Folder Include="Assets\" />
    </ItemGroup>
    <ItemGroup>
      <ProjectReference Include="..\MyApp\MyApp.csproj" />
    </ItemGroup>

    <!-- 
    Defining the "HasPackageAndPublishMenuAddedByProject" property here allows the Solution 
    Explorer "Package and Publish" context menu entry to be enabled for this project even if 
    the Windows App SDK Nuget package has not yet been restored.
  -->
    <PropertyGroup Condition="'$(DisableHasPackageAndPublishMenuAddedByProject)'!='true' and '$(EnableMsixTooling)'=='true'">
        <HasPackageAndPublishMenu>true</HasPackageAndPublishMenu>
    </PropertyGroup>
</Project>
C# 单元测试 MSTest WinUI-3

评论

0赞 Simon Mourier 11/17/2023
在某处(github,.zip等)共享一个完全可重复的项目会更容易

答:

0赞 Woz9 11/20/2023 #1

显然,我所尝试的不起作用。WindowsAppSDK 项目中提出了一个问题,但尚未解决。

单元测试不适用于 Windows 应用 SDK 1.2 #3245

唯一的解决方法似乎是在与要测试的代码相同的项目中添加单元测试。如果尝试为单元测试创建单独的项目,则当您尝试将依赖项添加到原始项目时,它会出错。