Модульное тестирование в JavaScript: как вы издеваетесь?- (тяжело для меня) пример - PullRequest
1 голос
/ 14 февраля 2012

Я просто переписал backbone-mongodb , чтобы он был действительно совместим с магистралью.У оригинального решения были хорошие клятвы для тестирования, и я хотел бы, чтобы мой код тоже тестировался, но просто не знаю, как это сделать.

Вот пример, который я хотел бы проверить:

update: function(callback) {

var model = this.model;

this._withCollection(function(err, collection) {
  if (err) callback(err);
  else {
    var attributes = _.clone(model.attributes);
    delete attributes['_id'];
    collection.update({ _id: new ObjectID(model.id) }, {$set: attributes}, {safe:true, upsert:false}, function(err) {
      model.fetch();
      callback(null, model.toJSON());
    });
  }
});


},

В этом коде нет ничего особенного.Он использует драйвер node-mongodb-native и обновляет запись в базе данных.AFAIK, надлежащее тестирование будет означать, по крайней мере, проверку того, что (1) collection.update вызывается с заданными аргументами, (2) callback вызывается, когда и как это должно быть, (3) модель содержит новые данные.

С обетами я могу проверить (2), но понятия не имею, как проверить (1).На самом деле, то же самое верно для каждой инфраструктуры модульного тестирования, о которой я знаю, qUnit, Jasmine.Я уверен, что это можно как-то сделать, и я решил изучить хотя бы один из них, но трудно сделать выбор, когда вы застряли в начале.:)

Я знаю о sinon.js и думаю, что каждый может быть проверен с использованием насмешек над всеми имеющимися у меня объектами, пока я не получу насмешку над коллекцией, но это кажется очень неуклюжим.Может ли кто-нибудь помочь мне в написании описанных выше тестов, и я с радостью напишу учебник по этому вопросу?

1 Ответ

1 голос
/ 14 февраля 2012

Я буду использовать Жасмин для этой цели; Не знаю, насколько вы знакомы с этой библиотекой, но у них есть плагин для использования jQuery для написания тестов спецификаций, вы можете загружать фикстуры / шаблоны и запускать тесты на ней.

для вашего конкретного случая, предполагая, что функция является частью "класса" MyObj, я напишу что-то вроде:

describe("My object tests", function() {

   it("Should update my obj", function () {
     var noError, flag = false;
     MyObj.update(function (err, model){
       flag=true;
       noError= err==null;
       // or you can do other checks on the result
     })

     // we wait for 5 sec until get a response (flag==true)
     waitsFor(function (){ return flag}, "Timeout on update", 5000);

     // check if there are no errors
     expect(noError).toBeTruthy();
   });

});
...