Post 请求在 Jest 中未通过测试但在 Postman 中通过

Post request fails test in Jest but passes in Postman

编辑:已回答。

我对 Jest 和 TDD 比较陌生,我正在尝试为我使用 React Native 创建的应用程序设置后端。我正在使用 TDD 并尝试在 login/register 用户端点上工作。当我通过 Postman 发送创建新用户的请求时,它会收到 200 响应,我最终会在 MongoDB 集合中找到一个新用户。

但是,当我 运行 使用 Jest 进行测试时,它 returns 有一个 400 响应。我似乎无法弄清楚为什么会这样。此套件中的前 2 个测试通过,只有最后一个测试失败。

users.test.js

const request = require("supertest")
const {User} = require("../../models/user")

let server
const users = "/api/users"

describe(`${users}`, () => {
    beforeEach(() => server = require("../../index"))
    afterEach(async() => {
        await server.close()
        await User.remove({})
    })

    let userEmail = "user1@a.a"
    let validUser = {username: "user1", email: userEmail, password: "1234567"}
    const exec = () => request(server).post(users).send(validUser)

    describe("/POST", () => {
        it("should return 400 if invalid data is given", async() => {
            validUser.email = "user1"
            const res = await exec()
            expect(res.status).toBe(400)
        })
        it("should return 400 if user with email already exists", async() => {
            validUser.email = userEmail
            await exec()
            const res = await exec()
            expect(res.status).toBe(400)
        })
        it("should return 200 and generate new user if valid information is given", async() => {
            const res = await exec()
            const user = await User.find({username: validUser.username})
            expect(user).not.toBeNull()
            expect(res.status).toBe(200)
        })
    })
})

users.js

const _ = require("lodash")
const bcrypt = require("bcrypt")
require("mongoose")
const express = require("express")
const router = express.Router()

const {User, validate} = require("../models/user")

router.post("/", async(req, res) => {
    const {error} = validate(req.body)
    if(error) return res.status(400).send(error.details[0].message)

    let checkUser = await User.findOne({email: req.body.email})
    if(checkUser) return res.status(400).send("User with that email already exists.")

    const user = new User(_.pick(req.body, ["username", "email", "password"]))
    const salt = await bcrypt.genSalt(10)
    user.password = await bcrypt.hash(user.password, salt)
    await user.save()
    res.send(user)
})

module.exports = router

编辑:如评论中所指出的,更改 validUser 对象会导致后续测试出现问题。将 userEmail 变量添加为有效电子邮件,并将 await 添加到 User.find()。在第一次测试中改变对象后,我将 validUser.email 属性 设置回有效的电子邮件,这解决了问题。

正如 Estus Flask 指出的那样,改变 validUser 对象是导致错误的原因。在第一次测试解决问题后,将 validUser.email 属性 设置回其原始有效电子邮件字符串。在 beforeEach 中分配的 validUser 也有效。