У меня проблема с командой test. Я пытаюсь смоделировать службу внутри командного теста, но есть проблема, что этот макет не используется в тесте.
Вот код команды:
public function __construct(RpcClient $rpcClient, LoggerInterface $logger, EntityManagerInterface $entityManager)
{
$this->rpcClient = $rpcClient;
$this->logger = $logger;
$this->entityManager = $entityManager;
parent::__construct();
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$apiSecurityKey = $this->getContainer()->getParameter('api_security_key');
try {
$apiBoxesData = $this->rpcClient->callJsonRPCPostMethod("stations_info", ["apiSecurityKey" => $apiSecurityKey]);
.
.
.
И тест:
//some of dependencies used
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\Console\Tester\CommandTester;
class SynchronizeBoxInfoCommandTest extends KernelTestCase
{
const SYNCHRONIZE_BOX_INFO_COMMAND_NAME = "app:synchronize-box-info";
public function setUp()
{
parent::setUp();
static::$kernel = static::createKernel();
static::$kernel->boot();
$application = new Application(static::$kernel);
$this->command = $application->find(self::SYNCHRONIZE_BOX_INFO_COMMAND_NAME);
$this->command->setApplication($application);
$this->commandTester = new CommandTester($this->command);
$this->entityManager = static::$kernel->getContainer()->get('doctrine.orm.entity_manager');
$logger = $this->createMock(LoggerInterface::class);
$this->rpcClientMock = $this->createMock(RpcClient::class);
$application->add(new SynchronizeBoxInfoCommand($this->rpcClientMock, $logger, $this->entityManager));
}
public function testFirstExecutionAllNewData()
{
$this->rpcClientMock->expects($this->once())
->method("callJsonRPCPostMethod")
->willReturn(["test"]);
$this->commandTester->execute([
'command' => $this->command,
]);
}
Для этого кода, когда я запускаю тест, команда, когда метод вызова команды callJsonRPCPostMethod
, не возвращает смоделированную строку «test», но вызывает реальную реализацию метода, которая делает вызов api. Я искал весь интернет и на самом деле не нашел ни одного хорошего ответа, который бы работал для меня.