Исчезающее значение в пользовательской функции модели Mongoose при тестировании с Jasmine-Node

Я пытаюсь протестировать свой пользовательский метод на моей модели 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 }.

Я установил пользователей в тесте, поэтому возвращаемое значение должно быть массивом пользователей. (Который все еще не пройдет тест в его текущем состоянии, но теоретически должен пройти, когда раскомментирует второй оператор return.) Вместо этого массив users отображается как пустой.

Как получить значение из тестовой модели для отображения в моей пользовательской функции?

1 ответ

Решение

Я изменил несколько вещей, чтобы это наконец заработало.

Я изменил массив пользователей на объект, подобный множеству, потому что это было более точное представление данных. Ключами для набора являются строки для ObjectId.

Для создания нового ObjectId у вас должна быть либо 12-байтовая строка, либо 24-символьная шестнадцатеричная строка. Первоначально я пытался сделать это с помощью однозначной строки. Я добавил вспомогательный помощник, который хранит фиктивные идентификаторы с шестнадцатеричными строками из 24 символов.

mongoose.Schema.Types.ObjectId а также mongoose.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));
    });
});
Другие вопросы по тегам