1

我正在尝试在我的 Mongoose 模型上测试我的自定义方法,但是我在测试模型中设置的值消失了,导致测试失败。测试看起来像这样:

it('should get the friend id', function(){
    var conversation = new Conversation({
        'users': [new ObjectId('0'), new ObjectId('1')]
    });

    expect(conversation.getFriendId('0')).toEqual(new ObjectId('1'));
});

我的模型声明包含以下内容:

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

var ConversationSchema = new mongoose.Schema({
    'users': [{'type': ObjectId, 'ref': 'User'}]
});

ConversationSchema.methods.getFriendId = function(userId) {
    return this.users;
    //return this.users[0] === new ObjectId(userId)
    //    ? this.users[1] : this.users[0];
};

module.exports = mongoose.model('Conversation', ConversationSchema);

当我运行测试时,我得到:

Expected [  ] to equal { path : '1', instance : 'ObjectID', validators : [  ], setters : [  ], getters : [  ], options : undefined, _index : null }.

我在测试中设置了用户,所以返回值应该是用户数组。(在当前状态下测试仍然会失败,但理论上应该在取消注释第二个返回语句时通过。)相反,用户数组显示为空。

如何从测试模型中获取值以显示在我的自定义函数中?

4

1 回答 1

2

我改变了一些事情来让它最终起作用。

我将 users 数组更改为类似集合的对象,因为它更准确地表示数据。集合的键是 ObjectId 的字符串。

要创建新的 ObjectId,您必须具有 12 字节的字符串或 24 字符的十六进制字符串。最初,我试图用一个数字字符串来做到这一点。我添加了一个使用 24 个字符的十六进制字符串存储虚拟 id 的规范助手。

mongoose.Schema.Types.ObjectIdmongoose.Types.ObjectId是两个不同的东西。在意识到我需要同时使用它们之前,我尝试了每一个。创建架构时,我需要mongoose.Schema.Types.ObjectId. 任何其他时候我指的是 ObjectId 类型,我需要mongoose.Types.ObjectId.

我试图从我定义它们以访问它们的文件中返回模型。相反,我需要打电话mongoose.model()来获取我的模型。

通过这些更改,我的模型定义现在如下所示:

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

var ConversationSchema = new mongoose.Schema({
    'users': Object,
    'messages': [
        {
            'text': String,
            'sender': {'type': ObjectId, 'ref': 'User'}
        }
    ]
});

ConversationSchema.methods.getFriendId = function(userId) {
    for (var u in this.users) {
        if (u !== userId) return new mongoose.Types.ObjectId(u);
    }

    return null;
};

// other custom methods...

mongoose.model('Conversation', ConversationSchema);

我的测试如下所示:

describe('getFriendId()', function(){
    var mongoose = require('mongoose');
    var ObjectId = mongoose.Types.ObjectId;

    require('../../../models/Conversation');
    var Conversation = mongoose.model('Conversation');

    var helper = require('../spec-helper');

    it('should get the friend id', function(){
        users = {};
        users[helper.ids.user0] = true;
        users[helper.ids.user1] = true;

        var conversation = new Conversation({ 'users': users });

        expect(conversation.getFriendId(helper.ids.user0)).toEqual(new ObjectId(helper.ids.user1));
    });
});
于 2014-02-18T00:40:12.493 回答