【问题标题】:NodeJS mockgoose save model does not seem to workNodeJS mockgoose 保存模型似乎不起作用
【发布时间】:2018-04-17 20:49:19
【问题描述】:

尝试对我的小 api 进行单元测试,我需要测试保存错误和成功(已经注册等)。

目前这是我的代码: models/auth.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var AuthSchema = Schema({
    id: String,
    user: String,
    password: String,
    origin: String,
});

//Export model
module.exports = mongoose.model('user', AuthSchema);

tests/api.test.js

const chai = require('chai');
const should  = chai.should;
const expect = chai.expect;
const assert = chai.assert;
/ Node Http Mocks
var httpMocks = require('node-mocks-http');

var util = require('util'),
    express = require('express'),
    bodyParser = require('body-parser'),
    validator = require('express-validator'),
    app = express();

var authController = require('../controllers/auth');

describe("Test AUTH Calls ", function() {
    var mongoHost = 'mongodb://localhost:27017/testingDB';

    // model
    var authModel = require('../models/auth.js');

    var Mongoose = require('mongoose').Mongoose;
    var mongoose = new Mongoose();

    var Mockgoose = require('mockgoose').Mockgoose;
    var mockgoose = new Mockgoose(mongoose);

    // Generate a v1 UUID (time-based)
    const uuidV1 = require('uuid/v1');

    before(function(done) {
        mockgoose.prepareStorage().then(function() {
            mongoose.Promise = global.Promise;
            mongoose.connect(mongoHost, {
                keepAlive: true,
                reconnectTries: Number.MAX_VALUE,
                useMongoClient: true
            },function(err) {
                done(err);
            });
            mongoose.connection.on('connected', function(err) {
                if (err) {
                    console.log('Error on DB Connection: ', err);
                } else {
                    console.log('Db Connection opened!');
                }

            });
        });
    });

it("should warn that the user already exists", function(done) {
        var req = httpMocks.createRequest({
            method: 'GET',
            url: '/signup',
            body: {
                'username': 'tricky',
                'password': 'frasier'
            }
        });
        var res = httpMocks.createResponse();


        var userModel = new authModel({
            id: uuidV1(),
            username: req.body.username,
            password: req.body.password
        });

        userModel.save(function(err) {
            if (err) {
                console.log('Error while registering a user.', err.name);
            } else {
                console.log('User saved successfully.');
            }
        });

        var userN = req.body.username;

        // Check if already exists
        var myUser = null;
        authModel.findOne({
            username: userN,
        }, function(err, user) {
            if (err) {
                console.log('Error while verifying a user.', err.name);
            }
            if (user) {
                console.log('User exists.');
                myUser = user;
            }

        });

        authController.signup(req, res); // Will fail on user existing
        assert.equal(res.statusCode, 401);
        done();
    });

});

现在的问题是第一个console.log 说“数据库连接已打开!”,如果我在填写后对模型(userModel)进行控制台日志,它会正确记录,但我的问题是保存。我不知道它是否保存,但内部没有控制台日志显示,失败或成功。

谁能告诉我我做错了什么?

谢谢

【问题讨论】:

    标签: node.js unit-testing mongoose chai mockgoose


    【解决方案1】:

    对我来说,它通过改变这个来起作用:

    var Mongoose = require('mongoose').Mongoose;
    var mongoose = new Mongoose();
    
    var Mockgoose = require('mockgoose').Mockgoose;
    var mockgoose = new Mockgoose(mongoose);
    

    var mongoose = require('mongoose');
    var { Mockgoose } = require('mockgoose');
    
    var mockgoose = new Mockgoose(mongoose);
    

    【讨论】:

    • 我知道这篇文章已经过时了,但你知道为什么它是这样工作的,而不是 Mockgoose 文档中指定的方式吗?顺便说一句,谢谢这也解决了我的问题:)
    • 我认为 API 发生了变化。现在 mockgoose 应该已经更新了文档
    【解决方案2】:

    代码是异步的,所以可能在 console.log 命令之前调用了 done()。您应该将一个回调放在另一个回调中,或者将代码转换为使用 Promise。

    【讨论】:

      【解决方案3】:

      你应该像这样 L 使用 new 关键字来实例化 Schema

      var AuthSchema = new Schema({
          id: String,
          user: String,
          password: String,
          origin: String,
      });
      

      【讨论】:

        猜你喜欢
        • 2018-11-27
        • 2023-01-02
        • 1970-01-01
        • 2019-01-03
        • 2020-12-07
        • 1970-01-01
        • 2013-01-31
        • 2019-04-20
        • 1970-01-01
        相关资源
        最近更新 更多