Исчезающее значение в пользовательской функции модели 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));
});
});