[英]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.