簡體   English   中英

發布請求在 Jest 中未通過測試,但在 Postman 中通過

[英]Post request fails test in Jest but passes in Postman

編輯:已回答。

我對 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)
        })
    })
})

用戶.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

編輯:正如評論中指出的那樣,改變有效用戶 object 會導致后續測試出現問題。 添加 userEmail 變量作為有效的 email 並將 await 添加到 User.find()。 在第一次測試中改變 object 后,我將 validUser.email 屬性設置回有效的 email,從而解決了問題。

正如 Estus Flask 所指出的那樣,將 validUser object 變異是導致錯誤的原因。 在第一次測試解決問題后,將 validUser.email 屬性設置回原來的有效 email 字符串。 在 beforeEach 中分配的 validUser 也有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM