首页 > 解决方案 > 为什么我需要 Razor 页面依赖项来为 .NET Core Web Api 编写集成测试?

问题描述

我正在尝试为我正在构建的 .NET Core Web Api 编写集成测试。

按照此处Microsoft.AspNetCore.App找到的文档,我Microsoft.AspNetCore.Mvc.Testing通过 Nuget 引用了包。

但是,当我尝试运行我的测试时,我收到以下消息的异常:

消息:System.IO.FileNotFoundException:无法加载文件或程序集“Microsoft.AspNetCore.Razor.Runtime,版本=2.1.1.0,文化=中性,PublicKeyToken=adb9793829ddae60”。该系统找不到指定的文件。

听起来像是在抱怨,因为缺少 Razor 页面依赖项?我的 Api 不使用 Razor 页面。为什么我需要这种依赖?难道我做错了什么?

作为相关的旁注:Microsoft.AspNetCore.Mvc.Testing和之间有什么不同Microsoft.AspNetCore.TestHost?前者在我上面链接的文档页面中提到,后者在同一页面的测试控制器标题下提到,几乎没有解释。

编辑:我已经使用 Nuget 在错误消息中安装了请求的包,但Microsoft.AspNetCore.Razor.Runtime我仍然收到相同的错误。现在我真的很困惑。

编辑 2:根据要求,测试项目的 .csproj 文件。

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

  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>

    <IsPackable>false</IsPackable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.Razor.Runtime" Version="2.2.0" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.8.0" />
    <PackageReference Include="xunit" Version="2.3.1" />
    <PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
  </ItemGroup>

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

</Project>

我的测试设置如下:

public class StartupIntegrationTests
    : IClassFixture<WebApplicationFactory<Startup>>
{
    private readonly WebApplicationFactory<Startup> _webAppFactory;

    public StartupIntegrationTests(WebApplicationFactory<Startup> webAppFactory)
    {
        _webAppFactory = webAppFactory.WithWebHostBuilder(builder => builder
            .UseStartup<Startup>()
            .UseSetting("https_port", "443"));
    }


    [Theory]
    [InlineData("/Users")]
    public async Task ShouldUseHttpsForAllRequestsIfClientDidAutoRedirect(string url)
    {
        var client = _webAppFactory.CreateClient();
        var response = await client.GetAsync(url);

        // Ensure that the returned URL is an https url and that there were no errors
        Assert.Equal(HttpStatusCode.OK, response.StatusCode);
        Assert.StartsWith("https://localhost:443/",
                          response.RequestMessage.RequestUri.OriginalString);
    }


    // Some more tests omitted to keep things short

}

标签: c#asp.net-coreasp.net-core-mvcintegration-testingasp.net-core-webapi

解决方案


这可能是由于 2.1 和 2.2 之间的版本不匹配:您的目标是 .NET Core 2.1,<TargetFramework>netcoreapp2.1</TargetFramework>但您包含 2.2.0 包。将 NuGet 包降级到 2.1.x 版本或将应用程序升级到 2.2.0:

  • 从此处下载 .NET Core 2.2 SDK
  • 将应用程序的目标框架从 更新netcoreapp.2.1netcoreapp2.2: <TargetFramework>netcoreapp2.1</TargetFramework>。确保为您的应用程序测试应用程序执行此操作
  • 将所有包引用更新Microsoft.AspNetCore到最新版本(2.2.0 或更高版本)。

还要确保Microsoft.AspNetCore.App在您的项目文件中包含对包的引用:

<PackageReference Include="Microsoft.AspNetCore.App" />

关于您关于Microsoft.AspNetCore.Mvc.Testingvs.的问题Microsoft.AspNetCore.TestHostTestHost命名空间由一组类型(包括TestServer)组成,以启用在内存中托管您的应用程序以进行测试。该包提供了基础设施,以通过使用该类Microsoft.AspNetCore.Mvc.Testing来启用应用程序(包括 )的功能测试。TestServerWebApplicationFactory


推荐阅读