因此,我尝试在dbcontext中使用预先设定的数据创建一个集成测试,但是由于某种原因,它没有将我的条目保存到数据库中,并且在我得到响应后返回了404 not found。如果需要,乐于扩展或澄清任何事情。
干杯
[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);
}发布于 2020-02-07 07:26:34
可能是因为您创建的(中间)服务提供者获得了它自己的内存数据库的单例实例。
在创建appFactory之后移动种子部分,并从appFactory解析来自服务提供商的dbcontext
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 ...https://stackoverflow.com/questions/60102665
复制相似问题