使用phpunit测试命令symfony

时间:2017-11-08 15:15:35

标签: php symfony phpunit symfony-3.2

我使用symfony3.2创建一些基本命令,以定期生成一些简报 当我想用phpunit 5.5.4测试我的symfony命令时,我正在处理一些问题。 它从一开始就失败了:

    /**
     * @param InputInterface $input
     * @param OutputInterface $output
     */
    protected function execute(InputInterface $input, OutputInterface $output){

        $output->writeln("<info>Script start</info>");
        //...
        $output->writeln("<info>done</info>");
     }

进行单元测试:

use MyBundle\Command\MyCommand;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\Console\Tester\CommandTester;

class MyCommandTest extends KernelTestCase
{

    public function testExecute(){

        $kernel = static::createKernel();
        $kernel->boot();

        $application = new Application($kernel);
        $application->add(new MyCommand());

        $command = $application->find('generate:newsletter');
        $commandTester = new CommandTester($command);
        $commandTester->execute(array(
            'command' => $command->getName()
        ));

        $output = $commandTester->getDisplay();
        $this->assertContains('done',$output);
    }
}

我一步一步跟随this,但在我的情况下,我得到:

Error: Call to a member function writeln() on string

MyBundle/Command/MyCommand.php:197
vendor/symfony/symfony/src/Symfony/Component/Console/Command/Command.php:262
vendor/symfony/symfony/src/Symfony/Component/Console/Tester/CommandTester.php:84
MyBundle/Command/MyCommandTest.php:34

似乎commandTester没有在MyCommand的execute方法中输入正确的参数。 我想知道它是不是CommandTesterClass问题。

这就是为什么我在这里,与你分享,并找到一些解决方案。

提前谢谢

1 个答案:

答案 0 :(得分:3)

方法'getDisplay()'返回一个字符串,您可以从Api doc中看到: http://api.symfony.com/3.0/Symfony/Component/Console/Tester/CommandTester.html并且您将该字符串分配给$ output变量。 我认为你需要的是'getOutput()'