c# - 为什么我需要 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
}
解决方案
这可能是由于 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.1
为netcoreapp2.2
:<TargetFramework>netcoreapp2.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.Testing
来启用应用程序(包括 )的功能测试。TestServer
WebApplicationFactory
推荐阅读
- javascript - 与服务器通信
- python - 如何在没有明确定义的字段值的情况下初始化字典
- c++ - 如果将其用作 Map 中的键,为什么使用不是 const 的操作数 < 函数定义结构会破坏事情?
- typescript - 从 node_modules 导入时,如果没有“new”,就不能调用类构造函数 Rectangle
- css - 不能在另一个图像上重叠多个图像?
- yarnpkg - 如何在同一台机器上安装 Yarn v1 和 Yarn v2 以便它们可以在项目之间互换使用?
- java - 如何覆盖 Spring Security 中特定端点的角色?
- python - 使用 Python 请求与 suiteCRM API V7.9 交互
- java - 使用简单的 for 循环将列表中的搜索转换为流方法
- angular - 我需要知道如何从其他函数调用值