Минимальный тест API NUnit: отсутствует testhost.deps.json [дубликат]
В моем проекте .NET6 есть несколько минимальных API, и я хочу их протестировать. Полный исходный код вы найдете на GitHub . Для этого я создал новый тестовый проект NUnit. В файле проекта я добавил
PreserveCompilationContext
и файл выглядит так
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<PreserveCompilationContext>true</PreserveCompilationContext>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="6.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="6.0.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.0.0" />
<PackageReference Include="NUnit" Version="3.13.2" />
<PackageReference Include="NUnit3TestAdapter" Version="4.2.0" />
<PackageReference Include="coverlet.collector" Version="3.1.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\src\MinimalApis.csproj" />
</ItemGroup>
</Project>
Затем я создал такую реализацию WebApplicationFactory
class MinimalApisApplication : WebApplicationFactory<Program>
{
protected override IHost CreateHost(IHostBuilder builder)
{
var root = new InMemoryDatabaseRoot();
builder.ConfigureServices(services =>
{
services.RemoveAll(typeof(DbContextOptions<ClientContext>));
services.AddDbContext<ClientContext>(options =>
options.UseInMemoryDatabase("Testing", root));
});
return base.CreateHost(builder);
}
}
Наконец, мой тестовый класс такой
public class Tests
{
[SetUp]
public void Setup()
{
}
[Test]
public async Task GetClients()
{
await using var application = new MinimalApisApplication();
var client = application.CreateClient();
var notes = await client.GetFromJsonAsync<List<ClientModel>>("/clients");
Assert.IsNotNull(notes);
Assert.IsTrue(notes.Count == 0);
}
}
Когда я запускаю проект, я получаю сообщение об ошибке
System.InvalidOperationException: не удается найти «C:\Projects\Net6MinimalAPIs\MinimalApis.Tests\bin\Debug\net6.0\testhost.deps.json». Этот файл необходим для правильной работы функциональных тестов. В папке bin исходного проекта должна быть копия файла. Если это не так, убедитесь, что свойство PreserveCompilationContext имеет значение true в файле проекта. Например, «правда». Чтобы функциональные тесты работали, их нужно либо запускать из выходной папки сборки, либо файл testhost.deps.json из выходного каталога вашего приложения необходимо скопировать в папку, в которой выполняются тесты. Распространенной причиной этой ошибки является включение теневого копирования при выполнении тестов.
Я немного погуглил, но не могу найти, как сгенерировать этот файл.
Обновлять
Я попытался добавить
xUnit
проект с тем же результатом. Кроме того, я заметил, что исходит от
using Microsoft.VisualStudio.TestPlatform.TestHost;
потому что я добавил эту ссылку, но это неправильно. Я хочу обратиться к
Program
в основном проекте, но он недоступен из-за его уровня защиты. То
Program.cs
выглядит
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<ClientContext>(opt =>
opt.UseInMemoryDatabase("Clients"));
builder.Services
.AddTransient<IClientRepository,
ClientRepository>();
builder.Services
.AddAutoMapper(Assembly.GetEntryAssembly());
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo {
Title = builder.Environment.ApplicationName, Version = "v1"
});
});
var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("v1/swagger.json",
$"{builder.Environment.ApplicationName} v1");
});
app.MapFallback(() => Results.Redirect("/swagger"));
// Get a shared logger object
var loggerFactory =
app.Services.GetService<ILoggerFactory>();
var logger =
loggerFactory?.CreateLogger<Program>();
if (logger == null)
{
throw new InvalidOperationException(
"Logger not found");
}
// Get the Automapper, we can share this too
var mapper = app.Services.GetService<IMapper>();
if (mapper == null)
{
throw new InvalidOperationException(
"Mapper not found");
}