Laravel 5.1单元测试与会话

时间:2015-06-16 14:36:32

标签: laravel laravel-5

鉴于此测试:

echo "\n";
echo Session::getId();

$this->call('GET', '/');

echo "\n";
echo Session::getId();

输出显示会话ID在请求后不会保留:

fb7e02798f043fac798a424547f0d01acd0dbdc0
83133c07abdbba5bc32f74eaf14362a69406ca45

据我所知,它们应该是相同的,app/config/session设置

'driver' => env('SESSION_DRIVER', 'file'),
'lifetime' => 120,
'expire_on_close' => false,
'domain' => "test.com",

4.2中的相同测试工作,不完全确定是否有额外的要求在单元测试中使用会话,或者我应该使用Facade实现。

编辑:0会话在网站上正常浏览

phpunit.xml

<env name="APP_ENV" value="local"/>
<env name="CACHE_DRIVER" value="file"/>
<env name="SESSION_DRIVER" value="file"/>
<env name="QUEUE_DRIVER" value="sync"/>

2 个答案:

答案 0 :(得分:3)

单元测试是关于测试单个类

我认为在这个例子中没有完全理解单元测试的意图。

单元测试不是要触摸您不想测试的课程。因此,它不应该包括第三方库或资源,它应该只是一个类。

每个其他代码依赖项都应该使用test double实现。

如果我在单元测试中包含具体会话,我实际上也会测试该对象。我为什么要?这意味着如果Laravel更改会话实现,我将不得不更改我的单元测试。

这意味着我将失去单元测试的优势,因为它应该是关于仅在一个类中发生的变化。失去优势后,我将失去测试的好处,看看其他课程在改变后是否仍然有效。

集成测试

访问方法更像是集成测试,因为它加载了控制器中定义的路由机制,控制器和其他依赖项。

您可以通过设置每个测试用例(或测试方法)的预期值来管理会话数据。

例如,如果您的结帐流程包含每个结帐步骤中的表单:

public function testFormStep1()
{
    //$this->visit...
}

public function testFormStep2()
{
    $this->session([
        //... data from step 1 you need in step 2 
    ]);

    //$this->visit...
}

通过这种方式,您可以控制每个测试用例。您不想依赖其他测试用例,测试应该孤立进行。

因此,例如,如果表单的第1步只能在所有表单字段存在时传递到第2步,则可以在步骤1中简单地创建另一个模拟字段为空的测试用例:

public function testFormStep2Error()
{
    $this->session([
        //... incomplete data from step 1
    ]);

    //... verify form step 2 should do something when form in step 1 is not completed
}

<强>硒

另一种选择是Selenium,它更多地存在于系统级别,因为它包含一个浏览器并通过HTTP请求通过Web服务器。会话通过会话cookie(和id)绑定到浏览器。通过这种方式,您可以保留每个请求的会话。

答案 1 :(得分:1)

单元测试在CLI /终端/命令行中运行。 Cli不能用于持久会话。

  

运行测试时,Laravel会自动将配置环境设置为测试。 Laravel在测试时自动配置会话和缓存到阵列驱动程序,这意味着测试时不会保留会话或缓存数据。

请参阅:http://laravel.com/docs/5.1/testing

实际上这与版本4.2中的消息几乎相同。所以不知道如何才能在单元测试中建立持久会话。