Bra*_*don 13 cookies supertest nestjs
我通过 NestJS API 中的 HTTP-Only cookie 传递身份验证令牌。
因此,在为我的 Auth 端点编写一些 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]);
  });
});
Run Code Online (Sandbox Code Playgroud)
在我的 JWT 策略中,我使用自定义 cookie 解析器。我遇到的问题是request.cookies总是undefined当它到达解析器时。然而,cookie 将出现在request.headers.
我正在关注这篇Medium文章中的手动cookie示例:https://medium.com/@juha.a.hytonen/testing-authenticated-requests-with-supertest-325ccf47c2bb,并且似乎没有任何其他请求对象上可用的方法来设置 cookie。
如果我从 Postman 测试相同的功能,一切都会按预期工作。我究竟做错了什么?
小智 11
我知道这是一个旧线程但是......
我也有 req.cookies 未定义,但出于不同的原因。
我正在独立测试我的路由器,而不是顶级应用程序。因此,我在 beforeEach 中引导应用程序并添加要测试的路由。
我得到了 req.cookies 未定义,因为 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({});        
    });
    
});
Run Code Online (Sandbox Code Playgroud)
通过这种方式测试,我可以独立于应用程序对路由器进行单元测试。req.cookies 按预期出现。
根据您关注的文章, https://medium.com/@juha.a.hytonen/testing-authenticated-requests-with-supertest-325ccf47c2bb的代码:
1) 的“cookie”值是.set('cookie', cookie)小写的在你的代码中它是帕斯卡大小写==>你是否尝试过在你的代码中使用小写字母?
2) 分配给“cookie”标头的 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) // <== here goes the diff
                                            .expect(200, done);
  });
});
Run Code Online (Sandbox Code Playgroud)
让我们知道这是否有帮助:)
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           11279 次  |  
        
|   最近记录:  |