首页 > 解决方案 > 如何在集成测试中模拟 session_id

问题描述

我的一个控制器中有此代码

$this->request->getSession()->id()

我的一个集成测试失败了,因为这个方法调用没有返回任何东西。我在我的测试设置中尝试了以下方法,但它不起作用:

$this->session([
    'id' => 'cb3d42b1-4ea0-44c6-8e29-368e948257eb',
]);

有没有办法$this->request->getSession()->id()在集成测试设置中返回一个值?

标签: cakephpcakephp-3.0

解决方案


\Cake\TestSuite\IntegrationTestTrait::session()方法接受为测试请求写入会话的值,即会话数据,它不会配置任何其他会话方面,如 ID。

cli通常 CakePHP 的 session 类会在 CLI 上运行时为 session id设置一个值,只需简单地做$this->id('cli'),但从 PHP 7.2 开始,当已经生成输出时将不再工作,同样从 CakePHP 3.5 开始,CakePHP 主动阻止设置ID 以防标头已发送,即您可能无法更改测试用例中的 ID。

那么你能做什么呢?好吧,您可以选择一个固定值并将其设置在您的测试引导程序( tests/bootstrap.php) 中,这也是 CakePHP 4.x 应用程序模板中的默认测试引导程序现在所做的,即只需执行以下操作:

session_id('my-custom-id');

推荐阅读