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

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

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

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

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

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

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 (на самом деле, Пророчеством).

Пожалуйста, ознакомьтесь с официальной документацией phpspec о насмешках http://www.phpspec.net/docs/introduction.html

Другие вопросы по тегам