如何编写测试以测试控制器和api,以便我可以在不依赖数据库的情况下运行PR检查?

问题描述 投票:0回答:1

这是控制器代码。该帖子或创建一个用户。电子邮件应该是唯一的,并且不能使用同一电子邮件再次创建帐户。


    exports.saveUser = (request, response) => {

        const result = (savedUser) => {
            response.status(200);
            response.json(savedUser);
        };

        bcrypt.hash(request.body.user.password, saltRounds, function(err, hash) {
            let user = {
                first_name : request.body.user.firstName,
                last_name : request.body.user.lastName,
                email : request.body.user.email,
                hashed_password : hash
            }
            console.log("conroller")
            const promise = userService.save(user);

            promise
                .then(result)
                .catch(renderErrorResponse(response));
        });

    };


这是服务层


    'use strict';
    const db = require("./../../models")
    /**
     * Saves the new user object.
     *
     * @param user
     */

    exports.save = (user,result) => {

       return db.User_tbl.create({
            first_name: user.first_name,
            last_name:user.last_name,
            email:user.email,
            hashed_password:user.hashed_password
          })
    }

下面是用户模型


    module.exports = (sequelize,DataTypes)=>{
        const user = sequelize.define("User_tbl",{
            first_name:{
                type: DataTypes.STRING(64),
                allowNull:false
            },
            last_name:{
                type: DataTypes.STRING(64),
                allowNull:false
            },
            email:{
                type: DataTypes.STRING(64),
                allowNull:false,
                unique:true
            },
            hashed_password:{
                type: DataTypes.STRING(255),
                allowNull:false
            },
            id:{
                type:DataTypes.INTEGER,
                primaryKey:true,
                autoIncrement: true
            }
        })
        return user;
    }

我已经做过的事情包括编写命中测试数据库的测试……但是由于在托管方面没有数据库,因此在PR检查中不起作用。尝试模拟续集,但文档不正确。

node.js sequelize.js chai sinon jest
1个回答
0
投票
  1. 上下文:您正在测试的函数是saveUser

情况:无法使用同一封电子邮件再次创建用户帐户。如果要使用Sinon,则需要stub userService.save。您需要定义在第一次调用(成功)和第二次调用(失败)中哪个check argumentdefine stub's behaviour的存根。最后,您需要验证存根get called twice或至少不止一次。我无法提供示例,因为我几乎不使用玩笑,但原理仍然相同。

  1. 上下文:您想在测试环境中测试命中测试数据库,但没有数据库。

取决于所使用的数据库,可以使用内存数据库。做法是在测试前打开/启动数据库,在测试后关闭/停止。如果使用mongodb,则可以使用mongodb-memory-server

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.