用 PHPUnit 测试 Symfony 命令

12

我使用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);
    }
}

我按照这个步骤逐步操作,但在我的情况下出现了:

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时没有正确的参数。我在想这是否是CommandTester类的问题。

这就是为什么我在这里分享,并希望一起找到解决方案。

提前感谢你。


2
好的,我找到了问题。在我的MyCommand类中,我使用了两个同名变量。一个用于获取模板,另一个用于OutputInterface。在获取模板后,我调用了writeln来显示“完成”,但是从错误的类中调用了它。重命名我的变量后,问题解决了。对此给您带来的不便表示抱歉。 - ryl
1个回答

8

谢谢您的快速回复。 我尝试使用getOuput方法,但仍然存在同样的问题。 我不认为这是MyCommandTest的问题。 - ryl
嗯,当从控制台运行时,你的命令是否有效?你能提供MyCommand.php中的第198行和197行吗? - avpav
是的,就是这样。我覆盖了一些我使用的commandtester变量。这就是为什么我会得到这个错误。谢谢你的帮助,对造成的麻烦表示抱歉。 - ryl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接