Как можно использовать сессию laravel в тесте phpspec?

Я пытаюсь протестировать очень простой класс с phpspec.

Некоторые методы класса, которые должны быть проверены

/**
 * @param Store $session
 */
function __construct(Store $session)
{
    $this->session = $session;
}

/**
 * @param Store $session
 */
function __construct(Store $session)
{
    $this->session = $session;
}

/**
 * Set the current order id
 *
 * @param $orderId
 */
public function setCurrentOrderId($orderId)
{
    $this->session->set($this->sessionVariableName, $orderId);

    return $this;
}

/**
 * Get the current order id
 *
 * @return mixed
 */
public function getCurrentOrderId()
{
    return $this->session->get($this->sessionVariableName);
}

и кусок теста

use Illuminate\Session\Store;


class CheckoutSpec extends ObjectBehavior
{
    function let(Store $session)
    {
        $this->beConstructedWith($session);
    }

    function it_is_initializable()
    {
        $this->shouldHaveType('Spatie\Checkout\Checkout');
    }

    function it_stores_an_orderId()
    {
        $this->setCurrentOrderId('testvalue');

        $this->getCurrentOrderId()->shouldReturn('testvalue');

    }
}

К сожалению, тест не пройден it_stores_an_orderId с этой ошибкой expected "testvalue", but got null.

Когда методы setCurrentOrderId а также getCurrentOrderId используются в ремесленном ремесленнике, они работают просто отлично.

Кажется, что в моей тестовой среде что-то не так с настройкой сеанса.

Как можно решить эту проблему?

1 ответ

Решение

Вы на самом деле пытаетесь проверить больше, чем просто ваш класс. Спецификации PHPSpec (и модульные тесты в целом) предназначены для работы в изоляции.

В данном случае вы действительно хотите убедиться, что ваш класс работает так, как задумано, не так ли? Просто издевайтесь над классом Store и проверяйте, что необходимые методы из него вызываются, и проверяйте их возвращаемые результаты, если они есть. Таким образом, вы все равно будете знать, что ваш класс работает так, как задумано, и не будет тестировать то, что уже было тщательно протестировано.

Вот как вы можете это сделать:

function it_stores_an_orderId(Store $session)
{
    $store->set('testvalue')->shouldBeCalled();
    $store->get('testvalue')->shouldBeCalled()->willReturn('testvalue');

    $this->setCurrentOrderId('testvalue');
    $this->getCurrentOrderId()->shouldReturn('testvalue');

}

Если вы все еще хотите задействовать некоторые другие классы напрямую, вам может подойти что-то вроде Codeception или PHPUnit, так как вы можете лучше контролировать свою среду тестирования.

Однако, если вы все еще хотите сделать это с PHPSpec, это может быть возможно с этим пакетом (хотя я сам не пробовал, так что никаких гарантий).

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