【问题标题】:how to write a test to test controller and api so I can run PR checks without database dependency?如何编写测试来测试控制器和 api,以便我可以在不依赖数据库的情况下运行 PR 检查?
【发布时间】:2020-09-15 03:50:53
【问题描述】:

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


    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 jestjs sequelize.js chai sinon


    【解决方案1】:
    1. 上下文:您的测试函数是saveUser

    案例:无法使用同一电子邮件再次创建用户帐户。如果你想使用Sinon,那么,你需要stub userService.save。您需要在第一次调用(成功)和第二次调用(失败)时定义 check argumentdefine stub's behaviour 的存根。最后,您需要验证您的存根是get called twice 还是至少不止一次。因为我很少用玩笑,所以我不能举个例子,但原理还是一样的。

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

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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 1970-01-01
      • 2011-04-15
      • 2011-06-13
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多