在所有测试之前运行命令

phi*_*ipp 10 phpunit symfony

我创建了一个Symfony命令来将我的应用程序重置为初始状态.要从cli运行该命令,我需要输入:

php bin/console app:reset
Run Code Online (Sandbox Code Playgroud)

我想在所有单元测试之前运行该命令一次.我可以设法在每次测试之前完成,并且肯定在所有课程之前.因此我使用了那段代码:

public function setUp()
{
    $kernel = new \AppKernel('test', true);
    $kernel->boot();
    $app = new \Symfony\Bundle\FrameworkBundle\Console\Application($kernel);
    $app->setAutoExit(false);

    $app->run(new ArrayInput([
        'command' => 'app:reset', ['-q']
    ]), new NullOutput());
}
Run Code Online (Sandbox Code Playgroud)

如上所述,这在每次测试之前都很好用,并且setUpBeforeClass()我可以在每个类之前使用它,但是在所有测试之前就足够了,因为该命令需要一些时间才能运行.

Jak*_*las 6

您可以实现测试侦听器并使用静态属性来确保您的命令只执行一次.

PHPUnit 5.4的示例:

<?php

use PHPUnit\Framework\TestCase;

class AppResetTestListener extends PHPUnit_Framework_BaseTestListener
{
    static $wasCalled = false;

    public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
    {
        if (!self::$wasCalled) {
            // @todo call your command

            self::$wasCalled = true;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您需要在配置中启用测试侦听器phpunit.xml.

阅读更多:


Ric*_*ich 5

Symfony文档说明了如何执行此操作:如何在运行测试之前自定义Bootstrap进程

简而言之,您需要修改phpunit.xml.dist来调用您自己的引导程序而不是默认引导程序(并委托给默认引导程序)。