8000 [Console] Adapt doc for easier testing of commands needing user inputs · symfony/symfony-docs@26fdbe0 · GitHub
[go: up one dir, main page]

Skip to content
  • Commit 26fdbe0

    Browse files
    committed
    [Console] Adapt doc for easier testing of commands needing user inputs
    Fix missing colon Change userInputs to inputs Try to fix platformsh build Re-add useful use statements Fixed typo, use FQCN::method Rollback not useful diff Formatting Add more examples, precise documentation typo 'would have type' => 'would have typed' removing an ending dot in comment for consistency
    1 parent a01f87f commit 26fdbe0

    File tree

    1 file changed

    +18
    -16
    lines changed

    1 file changed

    +18
    -16
    lines changed

    components/console/helpers/questionhelper.rst

    Lines changed: 18 additions & 16 deletions
    Original file line numberDiff line numberDiff line change
    @@ -277,7 +277,7 @@ Testing a Command that Expects Input
    277277
    ------------------------------------
    278278

    279279
    If you want to write a unit test for a command which expects some kind of input
    280-
    from the command line, you need to set the helper input stream::
    280+
    from the command line, you need to set the inputs that the command expects::
    281281

    282282
    use Symfony\Component\Console\Helper\QuestionHelper;
    283283
    use Symfony\Component\Console\Helper\HelperSet;
    @@ -289,26 +289,28 @@ from the command line, you need to set the helper input stream::
    289289
    // ...
    290290
    $commandTester = new CommandTester($command);
    291291

    292-
    $helper = $command->getHelper('question');
    293-
    $helper->setInputStream($this->getInputStream("Test\n"));
    294292
    // Equals to a user inputting "Test" and hitting ENTER
    295-
    // If you need to enter a confirmation, "yes\n" will work
    293+
    $commandTester->setInputs(array('Test'));
    294+
    295+
    // Equals to a user inputting "This", "That" and hitting ENTER
    296+
    // This can be used for answering two separated questions for instance
    297+
    $commandTester->setInputs(array('This', 'That'));
    298+
    299+
    // For simulating a positive answer to a confirmation question, adding an
    300+
    // additional input saying "yes" will work
    301+
    $commandTester->setInputs(array('yes'));
    296302

    297303
    $commandTester->execute(array('command' => $command->getName()));
    298304

    299305
    // $this->assertRegExp('/.../', $commandTester->getDisplay());
    300306
    }
    301307

    302-
    protected function getInputStream($input)
    303-
    {
    304-
    $stream = fopen('php://memory', 'r+', false);
    305-
    fputs($stream, $input);
    306-
    rewind($stream);
    307-
    308-
    return $stream;
    309-
    }
    308+
    By calling :method:`Symfony\\Component\\Console\\Tester\\CommandTester::setInputs`,
    309+
    you imitate what the console would do internally with all user input through the CLI.
    310+
    This method takes an array as only argument with, for each input that the command expects,
    311+
    a string representing what the user would have typed.
    312+
    This way you can test any user interaction (even complex ones) by passing the appropriate inputs.
    310313

    311-
    By setting the input stream of the ``QuestionHelper``, you imitate what the
    312-
    console would do internally with all user input through the CLI. This way
    313-
    you can test any user interaction (even complex ones) by passing an appropriate
    314-
    input stream.
    314+
    .. note::
    315+
    The :class:`Symfony\\Component\\Console\\Tester\\CommandTester` automatically simulates a user
    316+
    hitting ``ENTER`` after each input, no need for passing an additional input.

    0 commit comments

    Comments
     (0)
    0