2016-04-10 1 views
0

Я довольно новичок в Symfony и phpspec, поэтому, пожалуйста, не стесняйтесь критиковать. Поэтому проблема заключается в том, что я постоянно получаю PHP Fatal error: вызов функции-члена write() для не-объекта.phpspec Вызов функции-члена для не-объекта

В основном тестируемый класс должен записывать выходные данные на консоль. Вначале конструктора я создаю поток, а затем передаю этот поток другому классу, который отвечает за вывод в консоли. Это основной код.

Класс ScreenshotTaker:

<?php 

namespace Bex\Behat\ScreenshotExtension\Service; 

use Behat\Mink\Mink; 
use Behat\Testwork\Output\Printer\StreamOutputPrinter; 
use Bex\Behat\ScreenshotExtension\Driver\ImageDriverInterface; 
use Behat\Testwork\Output\Printer\Factory\ConsoleOutputFactory; 
/** 
* This class is responsible for taking screenshot by using the Mink  session 
* 
* @license http://opensource.org/licenses/MIT The MIT License 
*/ 
class ScreenshotTaker 
{ 
    /** @var Mink $mink */ 
    private $mink; 

    /** @var ConsoleOutputFactory $output */ 
    private $output; 

    /** @var ImageDriverInterface[] $imageDrivers */ 
    private $imageDrivers; 

    /** @var StreamOutputPrinter $outputStream */ 
    private $outputStream; 

    /** 
    * Constructor 
    * 
    * @param Mink $mink 
    * @param ConsoleOutputFactory $output 
    * @param ImageDriverInterface[] $imageDrivers 
    */ 
    public function __construct(Mink $mink, ConsoleOutputFactory $output, array $imageDrivers) 
    { 
     $this->mink = $mink; 
     $this->output = $output; 
     $this->imageDrivers = $imageDrivers; 
     $this->outputStream = new StreamOutputPrinter ($output); 
    } 

    /** 
    * Save the screenshot as the given filename 
    * 
    * @param string $fileName 
    */ 
    public function takeScreenshot($fileName = 'failure.png') 
    { 
     try { 
      $screenshot = $this->mink->getSession()->getScreenshot(); 

      foreach ($this->imageDrivers as $imageDriver) { 
       $imageUrl = $imageDriver->upload($screenshot, $fileName); 
       $this->outputStream->writeln('Screenshot has been taken. Open image at ' . $imageUrl); 
      } 
     } catch (\Exception $e) { 
      $this->outputStream->writeln($e->getMessage()); 
     } 
    } 
} 

Теперь это phpspec test.I'm пропусканием ConsoleOutputFactory, который используется в конструкторе, но я получаю

PHP Fatal error: Call to a member function write() on a non-object in Behat/Testwork/Output/Printer/StreamOutputPrinter.php on line 125

Этот метод записи является частью StreamOutputPrinter. Можете ли вы рассказать мне, что здесь здесь отсутствует?

ScreenshotTakerSpec:

<?php 

namespace spec\Bex\Behat\ScreenshotExtension\Service; 

use PhpSpec\ObjectBehavior; 
use Prophecy\Argument; 
use Behat\Mink\Mink; 
use Behat\Mink\Session; 
use Behat\Testwork\Output\Printer\Factory\ConsoleOutputFactory; 
use Bex\Behat\ScreenshotExtension\Driver\Local; 
use Behat\Testwork\Output\Printer\StreamOutputPrinter; 

/** 
* Unit test of the class ScreenshotTaker 
* 
* @license http://opensource.org/licenses/MIT The MIT License 
*/ 
class ScreenshotTakerSpec extends ObjectBehavior 
{ 
    function let(Mink $mink, ConsoleOutputFactory $output, Local $localImageDriver) 
    { 
     $this->beConstructedWith($mink, $output, [$localImageDriver]); 
    } 

    function it_is_initializable() 
    { 
     $this->shouldHaveType('Bex\Behat\ScreenshotExtension\Service\ScreenshotTaker'); 
    } 

    function it_should_call_the_image_upload_with_correct_params(Mink $mink, Session $session, Local $localImageDriver) 
    { 
     $mink->getSession()->willReturn($session); 
     $session->getScreenshot()->willReturn('binary-image'); 
     $localImageDriver->upload('binary-image', 'test.png')->shouldBeCalled(); 

     $this->takeScreenshot('test.png'); 
    } 
} 

ответ

1

Вы должны издеваться вызов outputFactory->createOutput(), который находится в StreamOutputPrinter линии 144, но насмешливый что-то в другом классе является запах. Поэтому я бы рекомендовал, чтобы переместить логику потока к новому классу, например, StreamOutputPrinterFactory, и вводить этот завод:

public function __construct(Mink $mink, StreamOutputPrinterFactory $factory, array $imageDrivers) 
{ 
    $this->mink = $mink; 
    $this->imageDrivers = $imageDrivers; 
    $this->outputStream = $factory->createNew(); 
} 

Теперь вы можете издеваться любые вызовы $this->outputStream.

Вы должны также позвонить по телефону createNew(), когда это необходимо, а не в конструктор. Дайте мне знать, если вам нужна дополнительная помощь.

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

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