我正在尝试为我正在构建的.NET Core Web Api编写集成测试。
在找到Here文档之后,我已经通过Nuget引用了软件包Microsoft.AspNetCore.App
和Microsoft.AspNetCore.Mvc.Testing
。
但是,当我尝试运行测试时,出现以下消息异常:
消息:System.IO.FileNotFoundException:无法加载文件或程序集“ Microsoft.AspNetCore.Razor.Runtime,版本= 2.1.1.0,区域性=中性,PublicKeyToken = adb9793829ddae60”。系统找不到指定的文件。
这听起来像是在抱怨,因为缺少Razor页面依赖项?我的Api不使用Razor页面。为什么需要这种依赖性?我在做错什么吗?
作为相关说明:Microsoft.AspNetCore.Mvc.Testing
和Microsoft.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
}
答案 0 :(得分:3)
这可能是由于2.1和2.2之间的版本不匹配:您通过<TargetFramework>netcoreapp2.1</TargetFramework>
定位.NET Core 2.1,但其中包含2.2.0软件包。将NuGet软件包降级到2.1.x版本,或将您的应用程序升级到2.2.0:
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
与Microsoft.AspNetCore.TestHost
的问题:TestHost
命名空间由一组类型(包括TestServer
)组成,可以在内存中托管应用程序以用于测试目的。 Microsoft.AspNetCore.Mvc.Testing
软件包提供了基础结构,以通过使用TestServer
类对应用程序(包括WebApplicationFactory
)进行功能测试。