使用mockgoose为mongoose(node.js的mongodb库)模拟populate方法为null

时间:2015-01-14 22:57:46

标签: node.js mongodb mocking

无法调试mockgoose用于填充设置了字段的属性的问题。 Yads mockgoose http://github.com/yads/Mockgoose fork解决了使populate选项工作的错误,但如果指定了字段,则会为填充的属性返回null。我尝试查看源代码并逐步调试,但不知道在哪里查看。我可以在调试器中看到populate选项触发调用以获取子元素 - 我看到调用make返回正确的子结果和正确的字段,但是当父元素最终返回时它具有子元素的属性element设置为null。

查询:

Posts.findById(foo).populate('createdBy', {fname:1, lname:1});

使用post.createdBy = null错误地返回帖子。省略了fame的fields参数,lname,以某种方式使它再次使用post.createdBy返回完整的对象。

以下是代码的一些摘录 - 虽然我不确定这些是正确的观察地点。

collections.js

this.find = function (conditions, options, callback) {
    var results;
    var models = db[name];
    if (!_.isEmpty(conditions)) {
        results = utils.findModelQuery(models, conditions);
    } else {
        results = utils.objectToArray(utils.cloneItems(models));
    }
    results = filter.applyOptions(options, results);

    if (results.name === 'MongoError') {
        callback(results);
    } else {
        var result = {
            toArray: function (callback) {
                callback(null, results);
            }
        };
        callback(null, result);
    }
};

util.js中

function cloneItems(items) {
    var clones = {};
    for (var item in items) {
        clones[item] = cloneItem(items[item]);
    }
    return clones;
}

function cloneItem(item) {
    return _.cloneDeep(item, function(value) {
        // Do not clone items that are ObjectId objects as _.clone mangles them
        if (value instanceof ObjectId) {
            return new ObjectId(value.toString());
        }
    });
}

这是关于这个问题的对话

https://github.com/mccormicka/Mockgoose/pull/90

0 个答案:

没有答案