Я довольно новичок в 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');
}
}