使用Supertest时未定义request.cookies [英] request.cookies is undefined when using Supertest

查看:15
本文介绍了使用Supertest时未定义request.cookies的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在通过NestJS API中的仅HTTP Cookie传递身份验证令牌。

因此,在为我的身份验证终结点编写某些E2E测试时,我遇到Cookie不在我预期的位置的问题。

以下是我的精简测试代码:

describe('auth/logout', () => {
  it('should log out a user', async (done) => {
    // ... code to create user account

    const loginResponse: Response = await request(app.getHttpServer())
                                              .post('/auth/login')
                                              .send({ username: newUser.email, password });

    // get cookie manually from response.headers['set-cookie']
    const cookie = getCookieFromHeaders(loginResponse);

    // Log out the new user
    const logoutResponse: Response = await request(app.getHttpServer())
                                            .get('/auth/logout')
                                            .set('Cookie', [cookie]);

  });
});

在我的JWT策略中,我使用的是自定义cookie解析器。我遇到的问题是,当request.cookies到达解析器时,它总是undefined。但是,Cookie将出现在request.headers中。

我遵循本文中的手动Cookie示例:https://medium.com/@juha.a.hytonen/testing-authenticated-requests-with-supertest-325ccf47c2bb,在Request对象上似乎没有任何其他方法可用于设置Cookie。

如果我从Postman测试相同的功能,则一切都按预期工作。我做错了什么?

推荐答案

我知道这是一个旧线程,但是.

我也有未定义的req.cookie,但原因不同。

我正在独立测试我的路由器,而不是顶级应用程序。因此,我在beforeEach中引导应用程序,并添加要测试的路由。

我未定义req.cookie,因为Express 4需要cookieParser中间件才能从标头分析cookie。

例如


const express           = require('express');
const bodyParser        = require('body-parser');
const cookieParser      = require('cookie-parser');
const request           = require('supertest');

const {router}  = require('./index');

describe('router', () => {
    let app;    
    
    beforeAll(() => {        
        app  = express();
        app.use(bodyParser.json());
        app.use(bodyParser.urlencoded({ extended: true }));
        app.use(cookieParser());
        app.use('/', router);
    });

    beforeEach(() => jest.clearAllMocks());

    it('GET to /', async () => {
        const jwt = 'qwerty-1234567890';
        
        const resp = await request(app)
            .get('/')
            .set('Cookie', `jwt=${jwt};`)
            .set('Content-Type', 'application/json')
            .send({});        
    });
    
});

这种测试方式允许我在独立于应用程序的情况下对路由器进行单元测试。req.cookie按预期出现。

这篇关于使用Supertest时未定义request.cookies的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆