代码之家  ›  专栏  ›  技术社区  ›  Bassinator

为什么我需要Razor页面依赖项来为.NET核心Web API编写集成测试?

  •  0
  • Bassinator  · 技术社区  · 6 年前

    我正在尝试为我正在构建的.NET核心Web API编写集成测试。

    根据找到的文档 Here 我已经参考了包裹 Microsoft.AspNetCore.App Microsoft.AspNetCore.Mvc.Testing 通过NuGET。

    但是,当我尝试运行测试时,会收到一个异常消息,其中包含以下消息:

    消息:System.IO.FileNotFoundException:无法加载文件或程序集“microsoft.aspnetcore.razor.runtime,version=2.1.1.0,culture=neutral,publicKeyToken=adb9793829ddae60”。系统找不到指定的文件。

    这听起来像是在抱怨,因为剃须刀页面的依赖性缺失了?我的API不使用Razor页面。为什么我需要这种依赖?我做错什么了吗?

    作为一个相关的旁注:在 Microsoft.aspnetcore.mvc.测试 以及 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
    
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Henk Mollema    6 年前

    这可能是由于2.1和2.2之间的版本不匹配:通过 <TargetFramework>netcoreapp2.1</TargetFramework> 但是你有2.2.0包。要么将nuget包降级到2.1.x版本,要么将应用程序升级到2.2.0版本:

    • 从下载.NET Core 2.2 SDK here
    • 从更新应用程序的目标框架 netcoreapp.2.1 netcoreapp2.2 : <targetframework>网络核心应用程序2.1</targetframework> . 确保为两个应用程序都这样做 您的测试应用程序
    • 更新的所有包引用 Microsoft.AspNetCore 最新版本(2.2.0或更高版本)。

    还要确保包含对 Microsoft.AspNetCore.App 在您的测试项目中,通过将其包含在项目文件中:

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

    关于你的问题关于 Microsoft.AspNetCore.Mvc.Testing VS Microsoft.AspNetCore.TestHost : TestHost 命名空间由一组类型(包括 TestServer )以便在内存中承载应用程序以进行测试。这个 Microsoft.aspnetcore.mvc.测试 软件包提供基础设施,以支持应用程序的功能测试(包括 测试服务器 )通过使用 WebApplicationFactory 班级。