javascript - 用 proxyquire 模拟 MongoDB

标签 javascript node.js mongodb unit-testing proxyquire

我想用 proxyquire 模拟 MongoDB 依赖 通过在我的测试中这样做:

var proxyquire = require('proxyquire');
var controller = path.resolve('.path/to/controller/file.js');

每个语句之前:

mocked_mongoose = {
     isMocked: true,
     model: function(name, schema, collection, skipInit) {
         return {
             find: function(conditions, projection, options, callback) {
                 console.log('callback find');
                 return callback();
             },
             save: function(options, fn) {
                 console.log('callback save');
                 return callback();
             },
             findOne: function(conditions, projection, options, callback) {
                 console.log('callback find one');
                 var model = mongoose.model(name);
                 var fakeModel = fakery.fake(model);
                 return callback(null, fakemodel);
             }
         }
     }
 };

proxyquire(controller, {
     'mongoose': mocked_mongoose
 });

当我去 Controller 做 console.log(mongoose.isMocked) 我没有定义,如果我打印 mongoose.model.toString() 似乎没有覆盖 mongoose 方法。

我跟进了this article并尝试实现相同的逻辑,但我没有得到相同的结果。

任何帮助将不胜感激, 谢谢!

最佳答案

我最终改变了我定义模拟 Mongoose 对象的方式,以完全匹配我想在 mt 案例中测试的场景:

第一个模型实例化

var Model = mongoose.model('SchemaDef');
var other = Model({
 _id:'someId'
 name'Some other fields'
});

模型搜索:

Model.findOne(query, callback);

这个版本是如何工作的:

'use strict';
var factory = require('factory-girl');
var mongoose = require('mongoose');

    function viewModel(name){
        function constructor(obj){
            if(obj){
                obj.find = constructor.find;
                obj.save = constructor.save;
                obj.findOne = constructor.findOne;
            }
            return obj;

        };
        constructor.isMocked = true;
        constructor.find = function(query, callback){
            factory.build(name, function(err, mockedModel){
                return callback(null,[mockedModel]);
            });

        };

        constructor.save = function(callback){
            factory.build(name, function(err, mockedModel){
                return callback(null,[mockedModel]);
            });
        };

        constructor.findOne=function(query,callback){
            factory.build(name, function(err, mockedModel){
                return callback(null,mockedModel);
            });
        };

        return constructor;
    };

module.exports = {
    model:function(name){
        factory.define(name, mongoose.model(name));
        return viewModel(name);
    }
};

关于javascript - 用 proxyquire 模拟 MongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34816660/

相关文章:

javascript - AJAX 调用在 jQGrid 中不起作用

javascript - 带有 Apache Tomcat 的 Express.js 服务器

javascript - 如何将查询url中的值插入 Node js中的mysql表?

perl - MongoFiles、GridFS 和 Perl

javascript - 如何迭代对象数组以便将数据推送到 Mongodb 嵌套数组中

javascript - 有没有比一系列正则表达式搜索/替换更好的方法将 HTML 转换为 JavaScript 中的纯文本

javascript - 验证名字和姓氏

通过 Java Servlet 转发后,表单重置的 Javascript 不起作用

javascript - 为什么在 Firebase 云函数中没有成功完成 Promise.all() 就退出无服务器函数时性能会下降?

蒙戈数据库 : find documents including references to sub-documents [node-mongodb-native]