首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为集成测试设定WebApplicationFactory种子不会保存,并给出一个404

为集成测试设定WebApplicationFactory种子不会保存,并给出一个404
EN

Stack Overflow用户
提问于 2020-02-07 04:02:15
回答 1查看 480关注 0票数 0

因此,我尝试在dbcontext中使用预先设定的数据创建一个集成测试,但是由于某种原因,它没有将我的条目保存到数据库中,并且在我得到响应后返回了404 not found。如果需要,乐于扩展或澄清任何事情。

干杯

代码语言:javascript
复制
[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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-07 07:26:34

可能是因为您创建的(中间)服务提供者获得了它自己的内存数据库的单例实例。

在创建appFactory之后移动种子部分,并从appFactory解析来自服务提供商的dbcontext

代码语言:javascript
复制
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 ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60102665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档