📜  symfony 按组加载夹具文件 (1)

📅  最后修改于: 2023-12-03 14:47:49.024000             🧑  作者: Mango

Symfony 按组加载夹具文件

在 Symfony 中,夹具文件(fixture)用于填充测试数据库中的数据以便于测试,但在实际开发中,夹具文件也被广泛应用于开发环境的数据填充,快速搭建数据结构等场景。

有时候,一个项目中有很多夹具文件,我们可能需要按组(group)加载这些夹具文件,以便于在进行特定类型的测试或者开发场景时只加载需要的夹具文件。Symfony 提供了一种非常方便的方式来完成按组加载夹具文件。

使用方式

在 Symfony 中,通常我们将夹具文件存放在 tests/Fixtures 目录下。如果需要按组加载夹具文件,则可以在 tests/Fixtures 目录下创建一个空的 .gitkeep 文件以表示该目录为一个有效的目录。然后按照以下格式,创建不同的夹具文件以便于按组加载:

tests/Fixtures/
├─ UsersFixtures.php
├─ PostsFixtures.php
├─ CustomersFixtures.php
└─ groups.yaml

其中,groups.yaml 为夹具组配置文件,示例如下:

users:
  - UsersFixtures.php
  - CustomersFixtures.php

posts:
  - PostsFixtures.php

同样的夹具文件也可都归为一个夹具组,示例如下:

all:
  - UsersFixtures.php
  - PostsFixtures.php
  - CustomersFixtures.php
加载指定组的夹具文件

通过加载配置文件来加载对应的夹具文件是 Symfony 按组加载夹具文件的核心所在,示例如下:

// tests/TestCase.php

protected function loadFixturesByGroup(string $group): void
{
    $finder = new Finder();
    $directory = $this->getFixturesDirectory();

    $groups = Yaml::parseFile($directory.DIRECTORY_SEPARATOR.'groups.yaml');
    if (!isset($groups[$group])) {
        throw new DomainException(sprintf('Fixture group "%s" not found.', $group));
    }

    foreach ($groups[$group] as $fixture) {
        $fixtureFile = $directory.DIRECTORY_SEPARATOR.$fixture;
        if (!file_exists($fixtureFile)) {
            throw new DomainException(sprintf('Fixture "%s" not found.', $fixtureFile));
        }

        $fixtures = require $fixtureFile;
        $fixtureLoader = new Loader();
        $fixtureLoader->load($fixtures);
    }
}

protected function getFixturesDirectory(): string
{
    return implode(DIRECTORY_SEPARATOR, [__DIR__, '..', 'Fixtures']);
}

使用示例:

// tests/Functional/PostControllerTest.php

public function testCreatePost()
{
    $this->loadFixturesByGroup('posts');

    // business logic here
}
总结

通过 groups.yaml 配置文件,我们可以非常方便地按组加载夹具文件,避免在加载时手动指定夹具文件,从而更加清晰地组织我们的夹具文件,并且方便修改和维护。