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 也有效。
编辑:已回答。
我对 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 也有效。