【问题标题】:Post request fails test in Jest but passes in Postman发布请求在 Jest 中未通过测试,但在 Postman 中通过
【发布时间】:2020-11-29 13:34:08
【问题描述】:

编辑:已回答。

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

但是,当我使用 Jest 运行测试时,它会返回 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

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

【问题讨论】:

  • 当我使用 Jest 运行测试时,它返回 400 响应 - 哪个?它在两个地方发送 400 并且您没有在测试中测试是什么原因。 validUser.email = "user1" - 你改变了后续测试中使用的对象,这可能是原因。 User.find 也是异步的,需要等待,但你还没有。
  • 改变对象导致错误。我用一个好的电子邮件创建了一个 userEmail 变量,然后在第一次测试中改变了对象,并在第二次将其设置为有效的电子邮件,从而解决了问题。
  • 很高兴这是这里唯一的问题。需要在 beforeEach 中分配 validUser,这样每次测试都会有新的对象。

标签: javascript node.js jestjs tdd


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-09-16
    • 2016-07-03
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 2022-01-04
    • 2020-05-30
    • 2017-01-22
    • 1970-01-01
    相关资源
    最近更新 更多