2017-01-05 10 views
0

Я пытаюсь спецификация команды Symfony, и я хочу быть отформатирован выход с SymfonyStyleМетод Получения клона называется на не-объекте, когда specing команды Symfony, которая использует SymfonyStyle для стилизованного выхода

<?php 

namespace Acme\AppBundle\Command; 

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; 
use Symfony\Component\Console\Input\InputInterface; 
use Symfony\Component\Console\Output\OutputInterface; 
use Symfony\Component\Console\Style\SymfonyStyle; 

class SomeCommand extends ContainerAwareCommand 
{ 
    //.... 
    protected function execute(InputInterface $input, OutputInterface $output) 
    { 
     $io = new SymfonyStyle($input, $output); 

     $io->title('Feed import initiated'); 
    } 
} 

и файлом спецификации:

<?php 

namespace spec\Acme\AppBundle\Command; 

use PhpSpec\ObjectBehavior; 
use Prophecy\Argument; 
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; 
use Symfony\Component\Console\Input\InputInterface; 
use Symfony\Component\Console\Output\BufferedOutput; 
use Symfony\Component\Console\Output\OutputInterface; 
use Symfony\Component\DependencyInjection\ContainerInterface; 

class SomeCommandSpec extends ObjectBehavior 
{ 
    //... 
    function it_fetches_social_feeds(
     ContainerInterface $container, 
     InputInterface $input, 
     OutputInterface $output, 
     SymfonyStyle $symfonyStyle 
    ) { 
     // With options 
     $input->bind(Argument::any())->shouldBeCalled(); 
     $input->hasArgument('command')->shouldBeCalled(); 
     $input->isInteractive()->shouldBeCalled(); 
     $input->validate()->shouldBeCalled(); 

     $symfonyStyle->title(Argument::any())->shouldBeCalled(); 

     $this->setContainer($container); 
     $this->run($input, $output); 
    } 
} 

, но я получаю эту ошибку:

exception [err:Error("__clone method called on non-object")] has been thrown. 
0 vendor/symfony/symfony/src/Symfony/Component/Console/Style/SymfonyStyle.php:50 
    throw new PhpSpec\Exception\ErrorException("__clone method called on ...") 
1 vendor/symfony/symfony/src/Symfony/Component/Console/Application.php:866 
    Symfony\Component\Console\Command\Command->run([obj:Symfony\Component\Console\Input\ArgvInput], [obj:Symfony\Component\Console\Output\ConsoleOutput]) 
2 vendor/symfony/symfony/src/Symfony/Component/Console/Application.php:193 
    Symfony\Component\Console\Application->doRunCommand([obj:PhpSpec\Console\Command\RunCommand], [obj:Symfony\Component\Console\Input\ArgvInput], [obj:Symfony\Component\Console\Output\ConsoleOutput]) 
3 vendor/phpspec/phpspec/src/PhpSpec/Console/Application.php:102 
    Symfony\Component\Console\Application->doRun([obj:Symfony\Component\Console\Input\ArgvInput], [obj:Symfony\Component\Console\Output\ConsoleOutput]) 
4 vendor/phpspec/phpspec/bin/phpspec:26 
    Symfony\Component\Console\Application->run() 
5 vendor/phpspec/phpspec/bin/phpspec:28 
    {closure}("3.2.2") 

на линии 50 SymfonyStyle является:

public function __construct(InputInterface $input, OutputInterface $output) 
{ 
    $this->input = $input; 
    /* line 50 */ $this->bufferedOutput = new BufferedOutput($output->getVerbosity(), false, clone $output->getFormatter()); 
    // Windows cmd wraps lines as soon as the terminal width is reached, whether there are following chars or not. 
    $this->lineLength = min($this->getTerminalWidth() - (int) (DIRECTORY_SEPARATOR === '\\'), self::MAX_LINE_LENGTH); 

    parent::__construct($output); 
} 

и phpspec является complainig о

clone $output->getFormatter() 

Я делаю что-то не так, или я что-то отсутствует?

Update

это мой let метод:

function let(SymfonyStyle $symfonyStyle, InputInterface $input, OutputInterface $output) 
{ 
    $symfonyStyle->beConstructedWith([$input->getWrappedObject(), $output->getWrappedObject()]); 
} 
+0

у вас 'let' функция? Как вы определяете, как создается SUS (система под спецификацией)? – DonCallisto

+0

Добавлена ​​функция 'let'. @DonCallisto –

ответ

1

Вы пропали без вести этот

function it_fetches_social_feeds(
    ContainerInterface $container, 
    InputInterface $input, 
    OutputInterface $output, 
    SymfonyStyle $symfonyStyle 
) { 
    // .... other code 
    $prophet = new Prophet(); 
    $formatter = $prophet->prophesize(OutputFormatterInterface::class); 
    $output->getFormatter()->willReturn($formatter); 
    // .... more code 
} 

Вы можете поместить его там, где вы хотите, но до того, как вызов делается.

Таким образом, вы создали Stub, который в основном является Double с поведением и без ожиданий. Вы можете увидеть его как «прокси», который перехватит вызовы методов и вернет то, что вы «научите» его возвращать.
В вашем примере вещи сломаются, так как ваш двойной OutputInterface вернет null, поскольку он не является «реальным» объектом.
Я также предлагаю заглушить поведение getVerbosity, если вам нужно сделать различные виды спецификаций.

BTW вы можете прочитать больше о двойниках в phpspec guide и prophecy guide

0

Глядя на example, SymfonyStyle кажется, никогда не будет принят в классе спецификации.
Функция выполнения команды также не передает ее, только классы ввода и вывода (класс стилей, созданный как локальная переменная).

+0

Я действительно не понял ваш ответ. Не могли бы вы рассказать о некоторых примерах? –

 Смежные вопросы

  • Нет связанных вопросов^_^