【发布时间】:2022-01-05 10:12:04
【问题描述】:
我目前正在使用 MERN 堆栈开发一个全堆栈应用程序。我一直在为每个路由的请求处理程序编写单元测试,并且在测试错误案例时发现了一些困难,特别是在尝试存根函数以拒绝承诺时
我有如下所示的相关代码:
我的一个端点。请求处理委托给 userController
const express = require("express");
const { body } = require("express-validator");
const router = express.Router();
const userController = require("../../controllers/user");
router.post(
"/",
body("username")
.isLength({
min: 3,
max: 30,
})
.withMessage(
"Your username must be at least 3 characters and no more than 30!"
),
body("password")
.isLength({ min: 3, max: 50 })
.withMessage(
"Your password must be at least 3 characters and no more than 50!"
),
userController.createNewUser
);
上述端点的请求处理程序。我正在尝试测试 createNewUser。我想存根 createNewUser 以便引发错误,因此我可以测试是否发送了 500 状态代码响应。
const bcrypt = require("bcryptjs");
const { validationResult } = require("express-validator");
const User = require("../models/User");
exports.createNewUser = async (req, res, next) => {
const { username, password } = req.body;
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({
success: false,
errors: errors.array(),
});
}
try {
// Create a bcrypt salt
const salt = await bcrypt.genSalt(12);
// Hash the password
const hashedPassword = await bcrypt.hash(password, salt);
// Create a new user
const user = new User({
username,
password: hashedPassword,
});
const response = await user.save();
res.status(200).json(response);
} catch (err) {
res.status(500).json({ msg: err.message });
}
};
用户端点的单元测试。 我不确定如何测试返回 500 状态码的错误情况...
const request = require("supertest");
// const todosController = require("../controllers/todos");
const server = require("../server");
const User = require("../models/TodoItem");
const db = require("./db");
const agent = request.agent(server);
// Setup connection to the database
beforeAll(async () => await db.connect());
afterEach(async () => await db.clear());
afterAll(async () => await db.close());
describe("User endpoints test suite", () => {
describe("POST api/user", () => {
test("It should create a user successfully and return a 200 response code", async () => {
const response = await agent
.post("/api/user")
.set("content-type", "application/json")
.send({ username: "Bob", password: "12345" });
expect(response.body.username).toEqual("Bob");
expect(response.status).toBe(200);
});
});
});
【问题讨论】:
-
首先我根本不会对控制器进行单元测试——你的测试不应该使用 Express 的 API。你展示的最后一个测试是没有意义的,它只是练习测试的两倍。
-
@jonrsharpe 嗯,这是有道理的,谢谢...我已经更改了显示端点测试的帖子。您将如何测试发送 500 状态代码响应的错误案例?
-
那么,究竟什么会导致错误被捕获并导致响应?
-
@jonrsharpe 嗯......不要认为任何预期会......测试过程肯定有点混乱!
标签: node.js unit-testing jestjs mocking sinon