php – 无法测试Symfony2控制台命令
发布时间:2020-12-13 17:17:45 所属栏目:PHP教程 来源:网络整理
导读:作为学习Symfony2的一部分,我正在尝试编写一个非常简单的控制台命令,它只运行phpcs( PHP Code Sniffer). 这是执行函数,它在扩展ContainerAwareCommand的类中: protected function execute(InputInterface $input,OutputInterface $output){ $output-writeln
作为学习Symfony2的一部分,我正在尝试编写一个非常简单的控制台命令,它只运行phpcs(
PHP Code Sniffer).
这是执行函数,它在扩展ContainerAwareCommand的类中: protected function execute(InputInterface $input,OutputInterface $output) { $output->writeln('<info>Generating PHP Code Sniffer report...</info>'); exec('phpcs ./src > ./app/logs/phpcs.log'); if ($input->getOption('noprompt') == null) { $dialog = $this->getHelperSet()->get('dialog'); if ($dialog->askConfirmation($output,'<question>Open report in TextMate? (y/n)?</question>',false)) { exec('mate ./app/logs/phpcs.log'); } } $output->writeln('<info>...done</info>'); } 我可以通过运行来执行控制台命令 app/console mynamespace:ci:phpcs 它完美无缺.输出文件按预期生成. 我正在尝试使用以下函数(它是PHPUnit_Framework_TestCase的一部分)来测试mynamespace:ci:phpcs命令: public function testExecute() { $kernel = new AppKernel("test",true); $kernel->boot(); $application = new Application($kernel); $application->add(new PhpCodeSnifferCommand()); $command = $application->find('mynamespace:ci:phpcs'); $commandTester = new CommandTester($command); $commandTester->execute(array('command' => $command->getName())); // ... Test if output file was created here ... ommitted for brevity ... // } 但是,当尝试通过单元测试执行它时,它会失败并显示以下输出: sh: phpcs: command not found 有谁知道为什么会这样? PS:我确实观察过的一件事是,当我在命令中注释掉调用’exec’的行时,测试会通过(不通过,但不会抱怨phpcs不存在),所以问题肯定是exec命令. PHPUnit测试是作为不同的用户运行的,phpcs不可用吗? 解决方法
对于单元测试,您应该考虑模拟对exec()的调用.这将加速您的测试并避免诸如此类的环境问题.对于这种情况,您只需添加调用exec()的方法到您可以模拟测试的类.
class PhpCodeSnifferCommand extends ... { protected function execute(InputInterface $input,OutputInterface $output) { // ... runReport(); // ... viewReport(); // ... } protected function runReport() { exec('phpcs ./src > ./app/logs/phpcs.log'); } protected function viewReport() { exec('mate ./app/logs/phpcs.log'); } } Mocking可以更轻松地验证三种可能的路径: >该命令被告知不提示用户查看报告. 将每个路径放在自己的测试中.您可以将公共代码放入测试助手方法中,以使其更短. public function testRunsReportWithoutAskingToView() { // ... $application = new Application($kernel); $phpcs = $this->getMock('PhpCodeSnifferCommand',array('runReport','viewReport')); $phpcs->expects($this->once())->method('runReport'); $phpcs->expects($this->never())->method('viewReport'); $application->add($phpcs); // Tell the command not to prompt to view the report ... } public function testRunsAndViewsReport() { // ... $application = new Application($kernel); $phpcs = $this->getMock('PhpCodeSnifferCommand','viewReport')); $phpcs->expects($this->once())->method('runReport'); $phpcs->expects($this->once())->method('viewReport'); $application->add($phpcs); // Tell the command to prompt to view and the dialog to hit "Y" for you ... } public function testRunsReportButDoesntViewIt() { // ... $application = new Application($kernel); $phpcs = $this->getMock('PhpCodeSnifferCommand','viewReport')); $phpcs->expects($this->once())->method('runReport'); $phpcs->expects($this->never())->method('viewReport'); $application->add($phpcs); // Tell the command to prompt to view and the dialog to hit "N" for you ... } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |