如何使用Jest和SuperTest模拟Cookie方法完成用户接口测试?
解决方法
你当前拿到cookie为undefined的核心原因有两个:
- 原
loginHelper里默认的userParams的email和password是空字符串,注册和登录请求都会失败,返回的响应自然没有set-cookie头 - 如果你要走mock逻辑,不需要真实发起注册登录请求,可以直接mock
loginHelper的返回值即可
方案1:Mock loginHelper 直接返回模拟cookie(符合你要mock的需求)
直接在测试文件顶部mock对应的模块即可,不需要修改原helper逻辑:
// update-user.test.js 顶部引入依赖后添加mock逻辑 jest.mock('../login-helper', () => ({ loginHelper: jest.fn().mockResolvedValue(['mock_session_id=abc123456; Path=/; HttpOnly']) }))
之后你在beforeEach里调用await loginHelper(request)时,就会直接返回你模拟的cookie数组,不会真实发起网络请求。如果需要不同测试用例返回不同cookie,可以在单个用例内重写mock返回值:
// 单个用例内自定义返回值 loginHelper.mockResolvedValueOnce(['custom_cookie=def789; Path=/'])
方案2:修复原逻辑不走mock也能拿到真实cookie
如果不需要mock,想要真实调用注册登录接口拿到有效cookie,修改两处逻辑即可:
第一步 修改loginHelper默认参数为合法值
// login-helper.js 替换默认userParams为合法测试账号 const loginHelper = async (request, email, password) => { // 替换为符合你接口校验规则的测试邮箱密码 const userParams = {email: 'test@demo.com', password: 'Test@123456'}; if (!(email && password)) { await request .post(`/api/v1/users`) .set('Accept', 'application/json') .send(userParams); } email = email || userParams.email; password = password || userParams.password; const loginResponse = await request .post(`/api/v1/users/login`) .set('Accept', 'application/json') .send({email: email, password: password}); // 可选添加调试逻辑,快速定位登录失败问题 if (loginResponse.status !== 200) { throw new Error(`登录请求失败: ${JSON.stringify(loginResponse.body)}`) } return loginResponse.headers['set-cookie']; };
第二步 优化测试文件重复注册逻辑
你当前beforeEach里已经单独发起了一次用户注册,和loginHelper内部的注册逻辑重复,可以调整为直接把注册的账号密码传给loginHelper,避免重复注册:
// update-user.test.js 的beforeEach修改 beforeEach(async ()=> { // 填写符合你接口校验规则的用户参数 const userParams = {email: 'test@demo.com', password: 'Test@123456', name: '测试用户'} const response = await request .post('/api/v1/users') .set('Accept', 'application/json') .send(userParams); user = response.body; // 直接传已经注册好的账号密码给loginHelper,跳过helper内部的注册逻辑 cookie = await loginHelper(request, userParams.email, userParams.password); });
内容的提问来源于stack exchange,提问作者Ansu
相关产品推荐
相关产品推荐

