golossus / php-test-fixture-loading
一个提供改进测试用例中加载固定数据的包
Requires
- php: >=7.1
Requires (Dev)
- phpunit/phpunit: >=7.5
README
php-test-fixture-loading 是一个包,旨在简化加载测试固定数据的过程,以提高可维护性和代码重用。使用此包,可以将(数据)固定数据创建为简单的类,用于组合更复杂的测试场景。
安装
composer require --dev golossus/php-test-fixture-loading
用法
配置
在基测试类或 TestCase
上使用 FixtureLoaderTrait 特性。这些通常会继承自 PHPUnit
测试类,如 Symfony 的 WebTestCase
或类似。
此外,此特性还有一个名为 buildFixture
的抽象方法,也应实现。此方法负责适应数据固定实例化的方式,因为不同的项目可能遵循不同的方法。这特别适用于需要依赖注入容器来构建固定数据的情况。
以下是一个示例 TestCase
类,它使用 Symfony 4 的 WebTestCase
。请查看特性和方法
<?php declare(strict_types = 1); namespace App\Tests\Rest; use Golossus\TestFixtureLoading\Fixture; use Golossus\TestFixtureLoading\FixtureLoaderTrait; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; class FunctionalTestCase extends WebTestCase { use FixtureLoaderTrait; protected function buildFixture(string $namespace): Fixture { return self::$container->get($namespace); } }
你的案例可能更复杂(或可能更简单),因此请实现此方法以满足你的需求。
对于上面的示例中的 Symfony 应用程序,不要忘记将固定文件夹声明为服务,否则你将无法构建固定数据。
尽管示例使用测试容器来构建数据固定数据,所以在实践中你被允许构建私有服务(这是默认行为),实际上可能需要使固定数据公开。请看以下示例
# in cofig/services_test.yaml services: _defaults: autowire: true autoconfigure: true App\Tests\DataFixtures\: resource: '../tests/DataFixtures/*' public: true
创建固定类
创建固定数据就像创建一个新的实现 Fixture 接口的类一样。此接口仅提供两个方法: load
和 depends
。第一个定义了创建数据的逻辑,并提供了一个 FixtureRepository 参数,用于在内存中存储对任何创建的对象(可能存储在数据库中)的引用,以便在测试函数之后检索。第二个方法用于定义在当前固定数据之前应该加载哪些其他数据固定数据。
所有加载的固定数据的依赖项也将被加载,即使它们没有直接在要加载的固定数据列表中指定。
如果任何固定数据声明了一个循环的依赖关系图,将在加载阶段抛出异常。
即使某些依赖项被多次使用,实际上也只加载一次。
以下是一个固定数据的示例
<?php declare(strict_types = 1); namespace Tests\Fixtures; use Golossus\TestFixtureLoading\AbstractFixture; use Golossus\TestFixtureLoading\FixtureRepository; ... class AdminUserFixture extends AbstractFixture { ... const ADMIN_USER = 'admin-user'; public function load(FixtureRepository $fixtureRepository): void { $company = $fixtureRepository->get(CompanyFixture::COMPANY); $user = $this->createAdminUserForCompany($company); $fixtureRepository->set(self::ADMIN_USER, $user); } public function depends(): array { return [ CompanyFixture::class, ]; } }
加载固定数据
完成上述配置后,使用非常简单,只需使用前面特性中提供的 loadFixtures
方法加载任何所需的固定数据。此方法返回一个特殊固定数据存储库,用于在加载过程中按需存储对象引用。
public function testWhateverYouLike() { // First load the required data fixtures $fixtures = $this->loadFixtures([ SomeDataFixture::class, AnotherDataFixture::class, ]); // You can get a data fixture object by key $dummy = $fixtures->get('some-key'); // The rest should be a normal test }
社区
贡献
这是一个开源项目。Golossus 团队希望使其能够由社区驱动,并开放给贡献者。请参阅贡献指南。
安全问题
如果您发现安全漏洞,请按照我们的披露程序进行操作。