Минимальный тест 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");
}

0 ответов

Другие вопросы по тегам