从donetCore 3.0中的单元测试项目初始化Microsoft.NET.Sdk.Web项目失败

时间:2019-11-22 12:34:25

标签: c# .net-core nunit-3.0

我有一个非常简单的点网核心项目。其中包括一个基于kestrel的MockServerLibrary,它在单元测试中返回一些简单的REST响应。

完整的设置可以在dotnetCore2.2上正常运行。切换到dotnetCore3.0会在服务器启动时产生错误:

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]完成的。当我单独启动MockServer的main-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中删除),但是当从单元测试开始时,似乎无法自动加载它们。

也许已经是错误,因为unitTest-Project直接引用了ServerMock:

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

并且ServerStart在[OneTimeSetup]中的连接非常硬:

await RestMockStarter.RunServer(null);

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

1 个答案:

答案 0 :(得分:0)

我能够解决问题:

(1)将ServerMock项目的csproj文件更改为

<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>

从那时起,我假设它成为一个“常规”的点网核心项目,并且使用<FrameworkReference Include="Microsoft.AspNetCore.App" />再次引用了Web扩展。

(2)已添加

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

也要到单元测试的csproj

(3)在这一点上,它仍然令人沮丧,因为该错误仍然发生,但是deleting the bin/obj-folder随后突然有所帮助。