我有一个 ASP.NET Core 应用程序和该 API 的集成测试。我使用 xunit 库来编写这些测试。测试具有以下结构:
public class AccountControllerTests : IAsyncLifetime
{
public async Task InitializeAsync()
{
// database initialization here.
// inserting default values to tables
}
// some tests here
[Fact]
public void Test1()
{
}
pulic async Task DisposeAsync()
{
// database cleanup
}
}
它工作正常,但许多测试不需要数据库初始化和清理。例如,如果我发送带有不正确数据的 http 请求来测试端点中的某些验证规则,我预计会得到错误的请求结果。在执行任何数据库查询之前此测试失败。所以我希望初始化逻辑是可选的,因为它会减慢测试的执行速度。我只想将初始化/清理逻辑应用于需要它的测试。不幸的是,每个测试都会执行
InitializeAsync
和 DisposeAsync
(Setup 和 TearDown)方法。我可以将我的测试类分为两部分(需要数据库初始化的测试和不需要数据库初始化的测试),但也许有更优雅的解决方案?
根据设计,xUnit 的初始化方法(ctor / InitializeAsync)不可能制定有关测试方法的规则。原因很严格:初始化方法先于测试方法(这基本上是面向对象的原则)。
但是,您可以使用 class-fixture 为所有测试创建单个连接(如果它符合您的测试议程)。
如果建立连接是测试流程的一部分(即取决于特定用例),那么我建议不要在所有测试之前创建连接。如果在用例 #1 下不需要数据库,则跳过测试 #1 下的连接。如果在用例 #2 下需要数据库,则在测试 #2 下建立连接。