如何在phpspec测试中使用laravel会话

时间:2014-08-22 23:47:53

标签: php session testing laravel-4 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.

当工匠的修补程序使用方法setCurrentOrderIdgetCurrentOrderId时,它们的工作正常。

在我的测试环境中,似乎会话设置有问题。

如何解决这个问题?

1 个答案:

答案 0 :(得分: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执行此操作,则可能使用this包(我自己也没有尝试过,所以不能保证)。