2016-09-28 3 views
0

Я только начал использовать PHPSpec, и я действительно наслаждаюсь им через PHPUnit, особенно без усилий и глупостей. Во всяком случае, метод, который я пытаюсь проверить, ожидает массив объектов Cell. Как я могу сказать PHPSpec, чтобы дать мне массив издевок?Как создать массив mocks в PHPSpec?

Упрощенная версия моего класса

<?php 
namespace Mything; 

class Row 
{ 
    /** @var Cell[] */ 
    protected $cells; 


    /** 
    * @param Cell[] $cells 
    */ 
    public function __construct(array $cells) 
    { 
     $this->setCells($cells); 
    } 

    /** 
    * @param Cell[] $cells 
    * @return Row 
    */ 
    public function setCells(array $cells) 
    { 
     // validate that $cells only contains instances of Cell 

     $this->cells = $cells; 

     return $this; 
    } 
} 

Упрощенная версия моего теста

<?php 
namespace spec\MyThing\Row; 

use MyThing\Cell; 
use PhpSpec\ObjectBehavior; 

class RowSpec extends ObjectBehavior 
{ 
    function let() 
    { 
     // need to get an array of Cell objects 
     $this->beConstructedWith($cells); 
    } 

    function it_is_initializable() 
    { 
     $this->shouldHaveType('MyThing\Row'); 
    } 

    // ... 
} 

Я надеялся, что я мог бы сделать следующее, но потом жалуется, что не может найти Cell[]. Используя FQN, он жалуется, что не смог найти \MyThing\Cell[].

/** 
* @param Cell[] $cells 
*/ 
function let($cells) 
{ 
    // need to get an array of Cell objects 
    $this->beConstructedWith($cells); 
} 

Единственные варианты я могу работать из, чтобы передать несколько типов-намекнули Cell аргументы и вручную объединить их в массив. Я что-то пропустил?

Edit: Я использую PHPSpec 2.5.3, как, к сожалению, сервер в настоящее время застрял на PHP 5.3 :-(

ответ

1

Почему бы вам не сделать что-то вроде

use Prophecy\Prophet; 
use Cell; // adapt it with PSR-4 and make it use correct class 

class RowSpec extends ObjectBehavior 
{ 
    private $prophet; 
    private $cells = []; 

    function let() 
    { 
     $this->prophet = new Prophet(); 

     for ($i = 0; $i < 10; $i++) { 
      $this->cells[] = $this->prophet->prophesize(Cell::class); 
     } 
     $this->beConstructedWith($cells); 
    } 
    // .... 

    function letGo() 
    { 
     $this->prophet->checkPredictions(); 
    } 

    public function it_is_a_dummy_spec_method() 
    { 
     // use here your cells mocks with $this->cells 
     // and make predictions on them 
    } 
} 

Пояснения

в let функции вы экземпляр Prophet объекта, который, в основном насмешливые библиотеки/рамка, которая используется в тандеме с PHPSpec (что сам по себе использовать пророчество).
Я предлагаю сохранить экземпляр ($this->prophet), который будет полезен для следующих шагов.

Теперь вы должны создать свои издевательства, и вы можете делать prophet и prophesize.
Даже для насмешек я предлагаю хранить их в приватной переменной, что вы возможно используйте для прогнозов в ваших методах.

letGo функция здесь, чтобы проверить явно ожидания, которые вы сделали на cells: без, cells являются только stubs или dummies.

Конечно, это удобно передать через подпись метода макет и пропустить checkPredictions явно, но, как только вам понадобится массив макетов, я полагаю, что это единственный способ достичь вашей цели.

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

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