我正在通过NestJS API中的仅HTTP cookie传递身份验证令牌。
因此,在为我的Authendpoint编写一些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解析器。我遇到的问题是请求。当cookie到达解析器时,它总是未定义的。但是,cookie将出现在请求中。标题。
我遵循这篇媒体文章中的手动cookie示例:https://medium.com/@juha.a.hytonen/testing-authenticated-requests-with-supertest-325ccf47c2bb,并且请求对象上似乎没有任何其他方法可以设置cookie。
如果我从Postman测试相同的功能,一切都会正常工作。我做错了什么?
我知道这是一条旧线,但。。。
我也有要求。cookies未定义,但原因不同。
我正在独立测试我的路由器,而不是顶级应用程序。所以我在beforeach中引导应用程序,并添加要测试的路由。
我收到了申请。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.cookies如预期的那样出现。
根据您正在阅读的文章,https://medium.com/@juha.a.hytonen/testing-authenticated-requests-with-supertest-325ccf47c2bb:
1)的代码在. set('cookie', cookie)
中的'cookie'值为小写,在您的代码中为Pascal大小写==
因此,要继续,可以尝试以下代码:
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);
});
});
让我们知道,如果这有助于:)
很晚了,但我希望我能帮助你。问题在于app对象的初始化。可能是你的主要原因。ts文件您已经按原样配置了一些中间件:cors和queryParse。创建应用程序时,您还必须将它们放在测试中。
const moduleFixture: TestingModule = await Test.createTestingModule({
imports: [AppModule],
}).compile();
const app = moduleFixture.createNestApplication();
// Add cors
app.enableCors({
credentials: true,
origin: ['http://localhost:4200'],
});
// Add cookie parser
app.use(cookieParser());
await app.init();