#express #testing #mocha.js
#экспресс #тестирование #mocha.js
Вопрос:
Я пытаюсь протестировать функцию, которая проверяет, вводит ли пользователь электронное письмо, и если это так, она возвращает true, в противном случае она передает аргумент ошибки следующей функции, а затем возвращает false . Тест, когда пользователь передает электронное письмо, выполняется успешно, но тест, когда пользователь не отправляет электронное письмо, завершается неудачей. Журналы ошибок заключаются в том, что next не является функцией. Как можно передать next в качестве аргумента?
const crypto = require("crypto");
const bcrypt = require("bcryptjs");
const jwt = require("jsonwebtoken");
const User = require("../model/userModel");
const throwsAnError = require("../utils/throwsAnError");
exports.signup = async (req, res, next) => {
const {email, username, password, confirmPassword} = req.body;
if(!checkIfEmailExists(email, next)) {
return;
}
try{
const user = await User.create({
email: email,
userName: username,
password: password,
confirmPassword: confirmPassword
});
res.status(200).json({
message: "success",
data: user
})
}
catch(e){
next(new throwsAnError("Ο χρήστης δεν μπορεί να δημιουργηθεί", 400, e));
console.log("I'm in");
}
};
function checkIfEmailExists(email, next) {
if(!email) {
next(new throwsAnError("Συμπληρώστε το e-mail", 400));
return false;
}
return true;
}
exports.checkIfEmailExists = checkIfEmailExists;
const expect = require("chai").expect;
const authController = require("../controller/authController");
describe("Testing if email exist", function() {
it("should return true if email exists", function() {
expect(authController.checkIfEmailExists("email@email.com")).to.be.true;
})
it("should return false if email does not exist", function() {
expect(authController.checkIfEmailExists(undefined, next)).to.be.false;
})
});
Ответ №1:
Когда вы вызываете функцию, для которой вы должны передать макет next
, это может быть так же просто, как передача:
() => {}
или любой другой макет (с использованием jest / sinon / etc), зависит от желаемого поведения.
Так что измените:
expect(authController.checkIfEmailExists("email@email.com")).to.be.true;
Для:
expect(authController.checkIfEmailExists("email@email.com", () => {})).to.be.true;
Кроме того, похоже, что вы смешиваете промежуточное программное обеспечение с app-logic: вы не показали нам, как checkIfEmailExists()
это выглядит, и я не вижу никаких веских причин для передачи next
.
Если это промежуточное программное обеспечение, оно должно вызываться как промежуточное программное обеспечение (из маршрута), а не явно, как это сделано здесь.
Комментарии:
1. @Chris вы не можете выдавать ошибку и возвращаться
false
одновременно. Вы должны выбрать либо или. Это не промежуточное программное обеспечение, поэтому вам не следует передаватьnext
— почему бы и нетreturn false
? чего вы пытаетесь достичь, вызываяnext(new throwsAnError("Συμπληρώστε το e-mail", 400));
?