如何在 symfony 3 控制台命令测试中设置控制台参数

How set console argument in symfony 3 console command testing

我在 Symfony 3.4 控制台命令应用程序中创建单元测试用例时无法设置参数

我的控制台命令

php bin\console identification-requests:process input.csv

我的控制台代码

protected function execute(InputInterface $input, OutputInterface $output)
{
    // Retrieve the argument value using getArgument()
    $csv_name = $input->getArgument('file');

    // Check file name
    if ($csv_name == 'input.csv') {
        // Get input file from filesystem
        $csvData = array_map('str_getcsv', file($this->base_path.$csv_name));
        $formatData = Helpers::formatInputData($csvData);

        // Start session
        $session = new Session();
        $session->start();

        foreach ($csvData as $key => $data) {
            if (!empty($data[0])) {
                $validation = Validator::getInformationData($data, $formatData[$data[1]]);
                if (!empty($validation)) {
                    $output->writeln($validation);
                } else {
                    $output->writeln('valid');
                }
            }
        }
    } else {
        $output->writeln('Invalid file!');
    }
}

我尝试了下面的测试代码

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

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

$command = $application->find('identification-requests:process')
                        ->addArgument('file', InputArgument::REQUIRED, "input.csv");
$commandTester = new CommandTester($command);
$commandTester->execute(array(
    'command' => $command->getName()
));

$output = $commandTester->getOutput();
$this->assertContains('valid',$output);

当我 运行 单元测试时它显示以下错误消息

There was 1 error:

1) Tests\AppBundle\Command\DocumentCommandTest::testExecute
Symfony\Component\Console\Exception\LogicException: An argument with name "file" already exists.

我认为您应该将您的输入放在命令测试器中,而不是命令查找器中,在这种情况下,您正试图为该命令创建另一个参数,这就是它告诉您它已经存在的原因。 试试这个

$command = $application->find('identification-requests:process');
$commandTester = new CommandTester($command);
$commandTester->execute(array(
    'command' => $command->getName(),
    'file' => 'input.csv'
));