功能测试问题:loginData Cookie未按预期删除
问题:「记住我的邮箱」复选框功能测试失败
登录表单设有「记住我的邮箱」复选框,勾选并登录成功时会创建loginData Cookie保存用户邮箱;取消勾选并登录成功时,自定义认证器会查找并删除该Cookie。该逻辑在Chrome开发者工具测试正常,但功能测试失败,测试代码如下:
public function testRememberEmailCheckboxNotCheckedCookiePreExistent(): void { $client = static::createClient(); $cookie = new Cookie('loginData', 'chocolate', strtotime('+1 year')); $client->getCookieJar()->set( $cookie ); $crawler = $client->request('GET', '/login'); $button = $crawler->selectButton('Login'); $form = $button->form(); $form['_remember_my_email']->untick(); $client->submit($form, [ '_username' => $email, //defined before '_password' => $password //defined before ]); $this->assertResponseRedirects("/"); $client->followRedirect(); $this->assertResponseStatusCodeSame(Response::HTTP_OK); $this->assertBrowserNotHasCookie('loginData'); //Failed asserting that the Browser does not have cookie "loginData" }
解决方案建议
- 校验Cookie删除的参数匹配:确认自定义认证器删除Cookie时,是否正确设置了过期时间为过去值(如
strtotime('-1 year')),同时保证Cookie的路径、域名和测试中设置的完全一致。路径/域名不匹配是Cookie删除失败的常见原因,比如业务代码删除时指定了/路径,但测试中添加Cookie时未指定,导致无法匹配删除。 - 统一测试与业务的Cookie创建参数:手动添加Cookie时,复刻业务代码中创建Cookie的完整参数,比如路径、HttpOnly属性等:
$cookie = new Cookie('loginData', 'chocolate', strtotime('+1 year'), '/', null, false, false); - 调整断言时机:
followRedirect()发起新请求可能导致CookieJar状态更新延迟,可以在提交表单后、跳转前直接检查响应头中的Cookie删除指令:$client->submit($form, [ '_username' => $email, '_password' => $password ]); // 检查重定向响应是否包含删除Cookie的Set-Cookie头 $this->assertStringContainsString('loginData=; expires=', $client->getResponse()->headers->get('Set-Cookie')); $client->followRedirect(); - 确保表单参数提交正确:验证
_remember_my_email的字段名是否准确,以及untick()是否正确提交了取消勾选的取值(如0或false),可以手动指定提交值避免歧义:$formData = $form->getPhpValues(); $formData['_remember_my_email'] = 0; $client->submit($form, $formData);
内容的提问来源于stack exchange,提问作者Matthiaasr
相关产品推荐
相关产品推荐

