首页 > 解决方案 > 从 donetCore 3.0 中的单元测试项目初始化 Microsoft.NET.Sdk.Web-Project 失败

问题描述

我有一个非常简单的 dot-net-core 项目。这包括一个基于 kestrel 的小 MockServerLibrary,它在单元测试中返回一些简单的 REST 回复。

完整的设置在 dotnetCore2.2 上运行良好。切换到dotnetCore3.0会导致Server启动报错:

Output stream: Unhandled exception. System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Extensions.Hosting.Abstractions, Version=3.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. Das System kann die angegebene Datei nicht finden.
File name: 'Microsoft.Extensions.Hosting.Abstractions, Version=3.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'
   at ServerMock.RestMockStarter.RunServer(String[] args)
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)

但只有,如果这是由[OneTimeSetup]单元测试项目的 完成的。main当我单独启动 MockServer 的-Method 时,服务器启动正常。

我的假设是,服务器启动失败,因为 ServerMock 是

<Project Sdk="Microsoft.NET.Sdk.Web">
    <PropertyGroup>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <LangVersion>8</LangVersion>
    </PropertyGroup>
(...)

但 unitTestProject 是

<Project Sdk="Microsoft.NET.Sdk">
(...)
    <ItemGroup>
        <PackageReference Include="nunit" Version="3.11.0" />
        <PackageReference Include="NUnit3TestAdapter" Version="3.15.1" />
        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.4.0" />
    </ItemGroup>
(...)

这在 2.2 中似乎不是问题,因为我们需要显式引用 ServerMock 中的包

    <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore" Version="2.2.0" />
        <PackageReference Include="Microsoft.AspNetCore.HttpsPolicy" Version="2.2.0" />
        <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />
        <PackageReference Include="Microsoft.AspNetCore.Mvc.Formatters.Xml" Version="2.2.0" />
    </ItemGroup>

据我了解,不再需要这些参考(更多:需要使用 3.0 删除),但从我的单元测试开始时,它们似乎无法自动加载。

也许错误已经存在,ServerMock 被 unitTest-Project 直接引用:

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

并且 ServerStart 在以下方面非常硬连线[OneTimeSetup]

await RestMockStarter.RunServer(null);

我已经尝试将 unitTest-Project 的类型更改为Microsoft.NET.Sdk.Web,但是不再可能启动/查看任何 unitTests(至少对于 Rider,所以我认为这不是我应该尝试解决问题的方式)

标签: c#.net-corenunit-3.0

解决方案


我能够解决问题:

(1) 将 ServerMock-project 的csproj-file 更改为

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

    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <LangVersion>8</LangVersion>
    </PropertyGroup>
    <ItemGroup>
        <Folder Include="Properties" />
    </ItemGroup>

    <ItemGroup>
        <FrameworkReference Include="Microsoft.AspNetCore.App" />
    </ItemGroup>

从那时起,我认为它成为了一个“常见的”dot-net-core 项目,并且<FrameworkReference Include="Microsoft.AspNetCore.App" />对网络扩展的引用再次明确。

(2) 增加

<ItemGroup>
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>

也到单元测试csproj

(3) 在那一点上,它变得有点令人沮丧,因为错误仍然存​​在,但删除 bin/obj 文件夹突然有所帮助。


推荐阅读