Как можно использовать сессию 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, это может быть возможно с этим пакетом (хотя я сам не пробовал, так что никаких гарантий).