Как передать next в качестве аргумента в тесте Мокко

#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)); ?