2014-12-15 3 views
1

При тестировании с помощью PHPSpec как я могу использовать интерфейсы классов, введенные в мои методы, а не фактический конкретный класс?Как использовать интерфейсы классов при использовании PHPSpec

Например, у меня есть Product класс, который впрыскивает VariationInterface в метод:

/** 
* ... 
*/ 
public function addVarient(VarientInterface $varient) 
{ 
    return $this->varients->add($varient); 
} 

Хотя с PHPSpec не имеет контейнера МОК связывать VarientInterface к Varient я не могу действительно проверить свои классы.

Не лучше ли использовать код для интерфейса, а не конкретный класс?

+0

Вы должны закодировать с интерфейсом, а не конкретный класс. Однако, это не вы в своем примере. Поскольку метод «добавить» не существует на интерфейсе, вы фактически кодируете реализацию. Также ответил на трекер проблемы с phpspec: https://github.com/phpspec/phpspec/issues/584#issuecomment-67090359 –

ответ

1

Вы можете издеваться над конкретными классами и задачами в PHPSpec.

Пожалуйста, проверьте этот пример:

<?php 

//file spec/YourNameSpace/ProductSpec.php 

namespace spec\YourNameSpace\Product; 

use YourNameSpace\VarientInterface; 
use PhpSpec\ObjectBehavior; 

class ProductSpec extends ObjectBehavior 
{ 
    function it_is_varients_container(VarientInterface $varient) 
    { 
     $this->addVarient($varient); 

     $this->getVarients()->shouldBe([$varient]); 
    } 
} 

Вы просто передать VarientInterface в качестве параметра метода испытаний. Этот VarientInterface издевается под PhpSpec (на самом деле Prophecy).

Пожалуйста, проверьте Offical phpspec documentaion о насмешливый http://www.phpspec.net/docs/introduction.html#prophet-objects

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