当前位置: 首页 > 知识库问答 >
问题:

要求使用Supertest时未定义Cookie

百里光熙
2023-03-14

我正在通过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测试相同的功能,一切都会正常工作。我做错了什么?

共有3个答案

董谦
2023-03-14

很晚了,但我希望我能帮助你。问题在于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();
胡博艺
2023-03-14

根据您正在阅读的文章,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);

  });
});

让我们知道,如果这有助于:)

夹谷星剑
2023-03-14

我知道这是一条旧线,但。。。

我也有要求。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如预期的那样出现。

 类似资料:
  • 我正在创建一个应用程序,使用Node、Express、ejs和multer上传图像。每次我提交表格时。文件未定义。我花了一整天的时间来排除故障,但却不知道自己做错了什么。 超文本标记语言 app.js

  • 我不知道我做错了什么,因为我对另一个程序使用了同样的方法,它完美地工作了... 提前致谢

  • 我的电子应用程序有问题。大约9个月前我就让它工作了,但现在我定制的最小化和最大化按钮不能正常工作。 这是我的文件结构 下面是 和 这是我的文件 当我单击最小化或最大化时,什么都不会发生。所以我去http://localhost:8000/html/index.html检查了控制台,我看到了这些错误 未捕获引用错误:索引处未定义require。html:137 未捕获的引用错误:在index.js:

  • 问题内容: 我的问题是类似这样的一个,但没有深入了解他的解决方案。 我正在使用Passport通过Instagram进行身份验证。成功通过身份验证后,用户将被定向到“ /”。在这一点上,请求具有用户对象(也可以正常工作)。但是,一旦我重定向,req.user是未定义的。:’( 奇怪的是,每个请求都会调用passport.deserializeUser。它成功获取了用户对象,但是在中间件的某个地方,

  • 问题内容: 我正在尝试使socket.io正常工作,但是现在在Chrome中出现错误: 未捕获的ReferenceError:未定义require client.php:9Uncaught ReferenceError:未定义io 我更改了包含socket.io.js文件的方式,因为它确实不存在: 如果我尝试 我得到: 无法加载资源:服务器响应状态为404(未找到) 这是Ubuntu上所有最新消息

  • 问题内容: 刚开始使用Node.js。在我的文件中,我正在执行以下操作: app.js 当我在终端中运行时,控制台会弹出,但在浏览器中却显示。 有人可以向我解释为什么在终端中可以正常运行,但在浏览器中却不能正常运行吗? 我正在使用节点的服务我的页面。 问题答案: 在终端中,您正在运行节点应用程序,并且正在运行脚本。与直接在浏览器中运行脚本相比,这是一个非常不同的执行环境。尽管Javascript语