📅  最后修改于: 2023-12-03 14:47:49.024000             🧑  作者: Mango
在 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
配置文件,我们可以非常方便地按组加载夹具文件,避免在加载时手动指定夹具文件,从而更加清晰地组织我们的夹具文件,并且方便修改和维护。