为什么我需要Razor页面依赖项才能为.NET Core Web Api编写集成测试?

时间:2019-01-07 22:41:51

标签: c# asp.net-core asp.net-core-mvc integration-testing asp.net-core-webapi

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

在找到Here文档之后,我已经通过Nuget引用了软件包Microsoft.AspNetCore.AppMicrosoft.AspNetCore.Mvc.Testing

但是,当我尝试运行测试时,出现以下消息异常:

  

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

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

作为相关说明:Microsoft.AspNetCore.Mvc.TestingMicrosoft.AspNetCore.TestHost有什么区别?我在上面链接的文档页面上提到了前者,而在同一页面的 Test Controllers (测试控制器)标题下提到了后者,几乎没有解释。

编辑:我已经使用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

}

1 个答案:

答案 0 :(得分:3)

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

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

还要确保在测试项目中包括对Microsoft.AspNetCore.App的软件包引用,方法是在项目文件中包含该软件包的引用:

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

关于您关于Microsoft.AspNetCore.Mvc.TestingMicrosoft.AspNetCore.TestHost的问题:TestHost命名空间由一组类型(包括TestServer)组成,可以在内存中托管应用程序以用于测试目的。 Microsoft.AspNetCore.Mvc.Testing软件包提供了基础结构,以通过使用TestServer类对应用程序(包括WebApplicationFactory)进行功能测试。