c# - ASP.NET Core 3.1 - WebApplicationFactory - WebApplicationFactoryContentRootAttribute 的正确用法是什么?
问题描述
我正在学习如何在 ASP.NET Core 3.1 中使用 WebApplicationFactory。特别是我想弄清楚WebApplicationFactoryContentRoot的正确用法
我创建了一个示例Github存储库来演示我遇到的问题。
我正在尝试使用 WebApplicationFactoryContentRoot 属性来设置 Startup 引导类的内容根目录../../../Src/WebApp
。
当我运行dotnet test
下面的代码时,它似乎没有引用WebApplicationFactoryContentRootAttribute设置。
ASystem.IO.DirectoryNotFoundException
被抛出:'我的解决方案基础目录'/WebApp.
路径应该是“我的解决方案基础目录”/Src/WebApp
如何让派生的WebApplicationFactory识别WebApplicationFactoryContentRootAttribute
集成测试
using System.IO;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Autofac.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Mvc.Testing;
using Xunit;
using Xunit.Abstractions;
using WebApp;
using WebApp.S3.Contracts;
using WebApp.Functional.Utilities;
/// Key should match FullName of assembly containing TStartup : WebApplicationFactory<TStartup>
/// https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.testing.webapplicationfactorycontentrootattribute?view=aspnetcore-3.0
[assembly: WebApplicationFactoryContentRootAttribute(
"WebApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
"../../../Src/WebApp",
"Program.cs",
"1")]
namespace WebApp.FunctionalTests
{
/// <summary>
/// Eventual Goal: Tryng to create WebApplicationFactory with content root at Src/WebApp using
/// appsettings file derived from ASPNETCORE_ENVIRONMENT variable. If
/// the variable is unset then defaults to appsettings.Local.json
/// </summary>
public class AppTestFixture : WebApplicationFactory<Startup>
{
//override methods here as needed for Test purpose
}
public class ApiIntegrationTest : IClassFixture<AppTestFixture>
{
private WebApplicationFactory<Startup> _factory;
private ITestOutputHelper _output;
/// <summary>
/// Initialise derived WebApplicationFactory and output stream
/// </summary>
/// <param name="factory"><see cref="AppTestFixture"/>, dervied WebApplicationFactory</param>
/// <param name="output">xUnit output stream</param>
public ApiIntegrationTest(AppTestFixture factory, ITestOutputHelper output)
{
const string contentRoot = "Src/WebApp";
_factory = factory;
_output = output;
// sanity check for FullName property of assembly containing Startup class
string fullName = Assembly.GetAssembly(typeof(Startup)).FullName;
_output.WriteLine($"FullName property of assembly containing 'Startup' class => {fullName}");
}
/// <summary>
/// /Users/me/Development/dotnet/blazormotiondetectionlistener/WebApp/ not found
///
/// Should be path /Users/me/Development/dotnet/blazormotiondetectionlistener/Src/WebApp/
/// </summary>
///
/// <remarks>
/// How do I use WebApplicationFactoryContentRoot attribute to correctly resolve this?
/// </remarks>
[Fact]
public async Task WebApp_App_ApiController_Test()
{
var client = _factory.CreateClient();
await Task.CompletedTask;
}
}
}
测试项目
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<Content Update="xunit.runner.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Autofac" Version="6.0.0" />
<PackageReference Include="Microsoft.AspNetCore" Version="2.2.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.2.0" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" />
<PackageReference Include="coverlet.collector" Version="1.0.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Src\WebApp\WebApp.csproj" />
<ProjectReference Include="..\..\Functional\Utilities\WebApp.Functional.Utilities.csproj" />
<ProjectReference Include="..\..\..\Src\WebApp.S3.Contracts\WebApp.S3.Contracts.csproj" />
</ItemGroup>
</Project>
解决方案
问题可能是您的文件引用Program.cs
何时应该是另一个程序集(即WebApp.dll
)的 DLL - 因为在您的Docker 容器*.cs
中,如果它基于构建输出,则不会有任何文件。
在测试项目中(在您已经拥有的测试文件中,或者AssemblyInfo.cs
如果有多个测试文件):
[assembly: WebApplicationFactoryContentRoot("MyNamespace.AssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "./", "MyNamespace.AssemblyName.dll", "1")]
在您的测试课程中:
private readonly WebApplicationFactory<Startup> applicationFactory = new();
正在测试的项目Startup
中的类在哪里。MyNamespace.AssemblyName
推荐阅读
- ssl - nginx add ssl 接口并发测试耗时比http长10倍
- bootstrap-table - 如何在下拉列表更改时更改表的数据源
- python - Python:定期在线程中运行http请求
- python - youtube数据api,外语支持
- angular9 - @grapecity/wijmo 在将我的 Angular 项目从 8 升级到 9 后抛出运行时错误
- python - 如何根据另一个字典的键长度生成不同的字典?
- typescript - vue 3 & typescript - 当 ComputedRef<> 位于 reactive() 内时无法访问它;
- json - 有没有办法使用 SOAPUI 验证整个 JSON 响应?
- javascript - 如何检查所选选项的价值是否高于另一个下拉菜单中的选项?
- java - 使用集合
删除列表中的索引