您好我正在尝试为symfony4控制台命令创建单元测试,但我无法正确注入依赖项 . 我对symfony4很新,所以也许这对你们来说是个基本问题 .
我的单元测试看起来像这样:
<?php
namespace App\Tests\Command;
use App\Command\ExecuteSalesTaskCommand;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\Console\Tester\CommandTester;
use Psr\Log\LoggerInterface;
use App\Repository\TaskRepository;
class ExeculteSalesTaskCommandTest extends KernelTestCase
{
/**
* @param LoggerInterface $logger
* @param TaskRepository $taskRepository
*/
public function testExecute(LoggerInterface $logger, TaskRepository $taskRepository)
{
$kernel = self::bootKernel();
$application = new Application($kernel);
$application->add(new ExecuteSalesTaskCommand($logger,$taskRepository));
# UPDATED
$logger = self::$kernel->getContainer()->get(LoggerInterface::class);
$taskRepository = self::$kernel->getContainer()->get(TaskRepository::class);
$command = $application->find('app:execute-sales-task');
$commandTester = new CommandTester($command);
$commandTester->execute(
[
'command' => $command->getName(),
]
);
// the output of the command in the console
$output = $commandTester->getDisplay();
$this->assertContains('Execute sales resulted: ', $output);
}
}
我的问题是我得到了这样的注入错误:
ArgumentCountError:函数App \ Tests \ Command \ ExeculteSalesTaskCommandTest :: testExecute()的参数太少,0传递,正好2个预期
更新:当我从容器中取出依赖项时,我得到这种错误:
有1个错误:1)App \ Tests \ Command \ ExeculteSalesTaskCommandTest :: testExecute Symfony \ Component \ DependencyInjection \ Exception \ ServiceNotFoundException:编译容器时已删除或内联“Psr \ Log \ LoggerInterface”服务或别名 . 您应该将其公开,或者直接停止使用容器并改为使用依赖注入 .
如何正确地注入必要的依赖项,以便创建ExecuteSalesTaskCommand的实例?
2 回答
我也遇到过类似的问题 . 但以下为我工作 . 我不认为您需要向应用程序添加命令并再次找到它?请找到以下解决方案 . 它可能会帮助别人 .
测试用例
测试结果
我正在使用以下Sf4版本
服务定义及其默认私有
我认为你不需要再次自动装配 .
我发现问题是我试图手动加载依赖项 . 使用自动装配,如下所示:
您需要从内核容器中获取命令 . 现在它有效 .