Как использовать интерфейсы классов при использовании PHPSpec

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

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

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

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

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


person AndrewMcLagan    schedule 15.12.2014    source источник
comment
Вы должны кодировать интерфейс, а не конкретный класс. Однако это не то, что вы делаете в своем примере. Поскольку метод add не существует в интерфейсе, вы фактически кодируете реализацию. Также ответил на трекер проблем phpspec: github.com/phpspec/phpspec/issues/ 584#issuecomment-67090359   -  person Jakub Zalas    schedule 18.12.2014


Ответы (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).

Пожалуйста, проверьте официальную документацию phpspec о насмешках http://www.phpspec.net/docs/introduction.html#prophet-objects

person l3l0    schedule 16.12.2014