Заполнение WebApplicationFactory для интеграционных тестов не сохраняет и дает 404 - PullRequest
0 голосов
/ 06 февраля 2020

Итак, я пытаюсь создать интеграционный тест с заранее заданными данными в моем dbcontext, но по какой-то причине он не сохраняет мою запись в базу данных и дает мне 404, не найденных после того, как я получу свой ответ. Рад расширить или уточнить что-нибудь, если это необходимо.

Приветствия

[Fact]
public async Task GetPet_ReturnsResourceWithAccurateFields()
{
    var fakePet = new FakePet { }.Generate();
    fakePet.PetId = 1;

    var appFactory = new WebApplicationFactory<StartupAutomatedTesting>()
        .WithWebHostBuilder(builder =>
        {
            builder
                .ConfigureServices(services =>
                {
                    services.Remove(new ServiceDescriptor(typeof(MyDbContext),
                        typeof(MyDbContext)));
                    services.AddDbContext<MyDbContext>(options =>
                    {
                        options.UseInMemoryDatabase("TestDb");
                    });

                    var serviceProvider = services
                        .AddEntityFrameworkInMemoryDatabase()
                        .BuildServiceProvider();

                    using (var scope = serviceProvider.CreateScope())
                    {
                        var context = scope.ServiceProvider.GetRequiredService<MyDbContext>();
                        context.Database.EnsureCreated();

                        context.Pets.AddRange(fakePet);
                        context.SaveChanges();
                    }
                });
        });

    var testingClient = appFactory.CreateClient();


    var result = await testingClient.GetAsync($"/v1/Pets/{fakePet.PetId}");
    var responseContent = await result.Content.ReadAsStringAsync();
    var response = JsonConvert.DeserializeObject<PetDto>(responseContent);

    // Assert
    response.Name.Should().Be(fakePet.Name);
    response.Age.Should().Be(fakePet.Age);
}

1 Ответ

0 голосов
/ 07 февраля 2020

Возможно, из-за созданного вами (промежуточного) поставщика услуг, который получает свой собственный одноэлементный экземпляр базы данных в памяти.

Переместите часть заполнения после создания appFactory и разрешите dbcontext из поставщика услуг из appFactory:

var appFactory = new WebApplicationFactory<StartupAutomatedTesting>()
   .WithWebHostBuilder(builder =>
   {
       ... etc ...
   });

using (var scope = appFactory.Services.CreateScope())
{
    var context = scope.ServiceProvider.GetRequiredService<MyDbContext>();
    context.Database.EnsureCreated();

    context.Pets.AddRange(fakePet);
    context.SaveChanges();
}

var testingClient = appFactory.CreateClient();

... etc ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...