【发布时间】:2020-11-11 06:56:11
【问题描述】:
我正在运行由 EF Core 存储支持的 ASP.NET Core Identity(UserManager<TUser> 和爵士乐)。我最近在我的应用程序中遇到了一个错误,其中控制器端点导致对UserManager<T>.UpdateAsync(...) 的调用过多。
由于我有集成测试(使用WebApplicationFactory<TStartup> 设置和UseInMemoryDatabase(...)),我很想编写一个集成/冒烟测试,如果控制器端点超出其查询预算,它会警告我。
基本上,我很想写(但不能写)这个测试:
public class FooControllerTests : IClassFixture<WebApplicationFactory>
{
private readonly WebApplicationFactory _factory;
public FooControllerTests(WebApplicationFactory factory)
{
_factory = factory;
}
[Fact]
public async Task Bar_WhenCalled_StaysWithinQueryBudget()
{
using var scope = _factory.Server.Host.Services.CreateScope();
var services = scope.ServiceProvider;
var dbContext = services.GetRequiredService<MyDbContext>();
var countBefore = dbContext.SomehowGetCurrentQueryCount(); // ??
var httpClient = _factory.CreateClient();
var _ = httpClient.PostAsJsonAsync("/foo/bar", new { data = "something" });
var countAfter = dbContext.SomehowGetCurrentQueryCount(); // ??
var budgetForEndpoint = 3;
Assert.True(countAfter - countBefore > budgetForEndpoint);
}
}
但重要的是精神:我想要一个冒烟测试来检查我将来是否不会犯同样的错误,并且是否有一个导致太多(更新)查询的错误。
我尝试编写a DbCommandInterceptor 并将其添加到我的AddDbContext 调用中,但似乎通过AddEntityFrameworkStores<TDbContext>(...) 添加的Store 与此隔离,因为我的CommandCreating 处理程序从未被调用。
如果查询通过 Identity EF Core Stores 运行,我如何检查我的端点是否在查询预算范围内?
我目前正在使用 ASP.NET Core 3.1 和 EF Core 3.1,但我愿意升级以获得此功能。
【问题讨论】:
标签: c# asp.net-core entity-framework-core asp.net-core-identity