symfony 3.4 phpunit和固定装置

时间:2018-10-09 10:24:45

标签: symfony phpunit fixtures

我想为不同的环境创建一些固定装置,例如prod加载默认值,为开发人员开发dev并使用phpunit进行测试。

我已经创建了一个抽象类

    abstract class AbstractFixture extends Fixture implements ContainerAwareInterface
{
    protected $container;

    public function setContainer(ContainerInterface $container = null): void
    {
        $this->container = $container;
    }

    public function load(ObjectManager $manager): void
    {
        $kernel = $this->container->get('kernel');
        if (\in_array($kernel->getEnvironment(), $this->getEnvironments(), true)) {
            $this->doLoad($manager);
        }
    }

    abstract protected function getEnvironments();

    abstract protected function doLoad(ObjectManager $manager);
}

例如,如果我想要开发环境的固定设备

    class DevFixture extends AbstractFixture implements DependentFixtureInterface
{
    public function getDependencies(): array
    {
        return [
            AppFixture::class,
            DevFixture::class,
        ];
    }

    protected function getEnvironments(): array
    {
        return ['dev'];
    }

    protected function doLoad(ObjectManager $objectManager): void
    {
    }
}

当我运行bin / console指令时:fixtures:load --env dev 没关系

现在,我想使用此灯具来用phpunit测试我的应用程序。 我想为每个测试加载夹具。

我想知道该怎么做?使用setUp()并运行doctrine:fixtures:load --env dev命令还是有其他方法?

1 个答案:

答案 0 :(得分:1)

您可以采取什么措施来实现预期的行为,我认为您可以使用bootstrap.php,它会在所有测试之前运行一次。

我想说的例子:

<?php declare(strict_types=1);

require __DIR__.'/../vendor/autoload.php';

echo 'Recreating and Seeding Database';
passthru('php "'.__DIR__.'/../bin/console" doctrine:database:drop --force --env=test');
passthru('php "'.__DIR__.'/../bin/console" doctrine:database:create --env=test');
passthru('php "'.__DIR__.'/../bin/console" doctrine:schema:create --env=test');
passthru('php "'.__DIR__.'/../../bin/console" doctrine:fixtures:load --env=test');
echo ' Done'.PHP_EOL;