集成测试的条件初始化

问题描述 投票:0回答:1

我有一个 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)方法。我可以将我的测试类分为两部分(需要数据库初始化的测试和不需要数据库初始化的测试),但也许有更优雅的解决方案?

asp.net-core integration-testing xunit
1个回答
0
投票

根据设计,xUnit 的初始化方法(ctor / InitializeAsync)不可能制定有关测试方法的规则。原因很严格:初始化方法先于测试方法(这基本上是面向对象的原则)。

但是,您可以使用 class-fixture 为所有测试创建单个连接(如果它符合您的测试议程)。

如果建立连接是测试流程的一部分(即取决于特定用例),那么我建议不要在所有测试之前创建连接。如果在用例 #1 下不需要数据库,则跳过测试 #1 下的连接。如果在用例 #2 下需要数据库,则在测试 #2 下建立连接。

© www.soinside.com 2019 - 2024. All rights reserved.