2014-12-29 4 views
2

Я хотел бы высмеять функцию save() модели Mongoose. Функция я хочу тест выглядит в файле под названием user.js:Жасмин spyOn mongoose save

var User = import('User.js') 

post: function(req, res) { 
    var user = new User({ 
     password : req.body.password, 
     email  : req.body.email, 
    }); 
    user.save(function(err) { 
    if (err) { 
     .... 
    } else { 
     .... 
    } 
    }); 

Я попытался написать тест, который выглядит, как это в другой файл под названием user_spec.js:

var Hander = require('user.js') 

it('works properly', function() { 
    spyOn(User, 'save').andReturn(null) 
    Handler.post(req, res); 
}); 

но что дает мне ошибку:

save() method does not exist 

я сделал немного больше выкапывать и она выглядит как сама модель Пользователь не имеет метода сохранения(), экземпляр делает. Это означало бы, что я должен издеваться над конструктором пользователя, но у меня с этим много проблем. Другие сообщения ссылаются на заявление, как:

spyOn(window, User) 

, чтобы исправить это, но в NodeJS, глобальный (окно эквивалент здесь), не имеет пользователя, так как я импортировать в качестве переменной. Можно ли издеваться над конструктором, чтобы дать мне что-то с насмешкой save()? Я также рассмотрел модуль npm под названием rewire, но я надеялся, что смогу сделать это без насмешек и замены всего пользовательского модуля в моем обработчике.

+0

здесь не достаточно информации, опубликовать ваш фактический код и тест – user2943490

+0

@ user2943490 С тех пор я добавил код и тест – ritmatter

ответ

1

Это не решает проблему насмешки локальной переменной, но это решит проблему модульного тестирования создания новых документов.

При создании нового документа лучше использовать Model.create(). Это можно издеваться эффективно, и это просто меньше кода. Правильный способ справиться с этим, и проверить это будет:

var User = import('User.js') 

post: function(req, res) { 
    User.create({ 
     password : req.body.password, 
     email  : req.body.email, 
    }, function(err) { 
    if (err) { 
     .... 
    } else { 
     .... 
    } 
    }); 
}); 

Соответствующие испытания:

var Hander = require('user.js') 

it('works properly', function() { 
    spyOn(User, 'create').andReturn(null) 
    Handler.post(req, res); 
}); 

Надеюсь, этот способ поможет другим людям получать разочарование в связи с жасмин и мангуст модульного тестирования.

0

Вы можете заменять функцию только шпионом после создания объекта. Следовательно, это будет работать:

var user = new User(…); 
spyOn(user, save).…; 
doSomething(); 

, где это не будет:

spyOn(User, save).… 
doSomething() 

Конечно, вы могли бы изменить функцию внутри мангуста, что создает функцию сохранения на объекте ... но вы, вероятно, не хотят иди туда.

0

В нормальном мире вы сможете это сделать.

spyOn(Model.prototype, 'save')

Однако Mongoose пытается перегружать все свои функции Модели для работы в качестве node.js обратных вызовов и Обещает одновременно. Чтобы сделать это, они манипулируют прототипом таким образом, который трудно предсказать, не читая фактический код модели (https://github.com/Automattic/mongoose/blob/master/lib/model.js).

Вот пример, который действительно сработал для меня.

spyOn(Model.prototype, '$__save').and.callFake(function (options, callback) { callback(); });

Для записи я использую Мангуст с Promises в коде приложения.

Смежные вопросы