我如何在集成测试中模拟 session_id

how do I mock a session_id in my integration test

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

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

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

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

有没有办法让 $this->request->getSession()->id() return 成为集成测试设置中的一个值?

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

通常 CakePHP 的 session class 会在 运行 上为 session id 设置值 cli CLI,只需执行 $this->id('cli'),但从 PHP 7.2 开始,当已经生成输出时,它将不再工作,同样从 CakePHP 3.5 开始,CakePHP 积极防止在 headers 已经发送的情况下设置 ID,即您可能无法在测试用例中更改 ID。

那么可以做什么?好吧,你可以接受一个固定值和 set it in your test bootstrap (tests/bootstrap.php),这就是现在 CakePHP 4.x 应用程序模板中的默认测试 bootstrap也这样做,即简单地做:

session_id('my-custom-id');