如何从 Jest 中的超级测试请求中检索 cookie?

Tia*_*dão 4 cookies typescript supertest jestjs

我刚刚开始使用 Jest,正在尝试测试端点POST/register。该端点发回 2 个 cookie:accessToken:*jwt*refreshToken:*jwt*

这是我的测试文件:

import server from "../server"
import supertest from "supertest"
import mongoose from "mongoose"

import dotenv from "dotenv"
dotenv.config()

const request = supertest(server)

describe("Testing Auth endpoints", () => {
  beforeAll(done => {
    const PORT = process.env.PORT
    mongoose
      .connect(process.env.MONGO_STRING_TEST!)
      .then(() => {
        console.log("Connect to Atlas. Test DB.")
        done()
      })
      .catch(err => console.log(err))
  })

  const validUser = {
    name: "Paul Stevens",
    email: "ps@g.com",
    password: "1234",
    role: "host",
  }

  it("should test /register for a valid request and return 201 status code and accessToken and refreshToken through cookies", async () => {
    const resp = await request.post("/users/register").send(validUser)
    // I want the content of the cookies here
  })

  afterAll(done => {
      mongoose.connection.close(() => {
        done()
    })
  })
})
Run Code Online (Sandbox Code Playgroud)

这是终点。我正在测试这个东西,所以我实际上在响应正文和 cookie 中发送令牌。

UsersRouter.post("/register", async (req, res, next) => {
  try {
    const newUser = new UserModel(req.body)
    const savedUser = await newUser.save()
    const { accessToken, refreshToken } = await getTokens(savedUser)
    res.cookie("accessToken", accessToken, { httpOnly: true })
    res.cookie("refreshToken", refreshToken, { httpOnly: true })
    res.status(201).send({ accessToken, refreshToken, user: savedUser })
  } catch (error) {
    next(createError(400, error as Error))
  }
})
Run Code Online (Sandbox Code Playgroud)

如何检索这两个令牌,以便可以重用它们来测试其他端点?我可以看到 cookie 位于 resp.header["set-cookie"] 下,但这是一个包含两个包含标记的字符串的数组。有没有更好的方法来简单地提取令牌?

Yag*_*ann 11

我知道已经晚了,但迟到总比不到好,最近我试图在我的 API 中进行相同类型的测试,所以我为访问 cookie 所做的只是从标头中提取它,如下所示:

  it("should test /register for a valid request and return 201 status code and accessToken and refreshToken through cookies", async () => {
    const resp = await request.post("/users/register").send(validUser)
    const cookies = resp.headers['set-cookie']
    console.log(cookies)
    // your cookies will looks like this:
    // [
   //    "accessToken=yourAccessToken",
  //     "refreshToken=yourRefreshToken"
       ]
  })
Run Code Online (Sandbox Code Playgroud)

希望它可以帮助其他遇到同样问题的人!