2012-02-13 8 views
1

Я просто переписал backbone-mongodb, чтобы быть действительно совместимым с позвоночником. В оригинальном решении были хорошие обеты для тестирования, и я бы хотел, чтобы мой код также прошел тестирование, но просто не знаю, как это сделать.модульное тестирование в javascript: как вы издеваетесь? - a (трудный для меня) пример

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

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 и обновляет запись в базе данных. AFAIK, правильное тестирование означало бы, по крайней мере, проверить, что (1) collection.update был вызван с данными аргументами, (2) callback вызывается, когда и каким он должен быть, (3) модель содержит новые данные.

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

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

+2

как сбор и модель передается в класс обновлений? –

+0

Вы можете увидеть вызов '_withCollection'. Фактически, я устанавливаю переменную 'this.collectionName', а' _withCollection' извлекает коллекцию с учетом ее имени и вызывает обратный вызов с возвращенной коллекцией. Это общий подход с node.js. Вы используете обратные вызовы повсюду, так как структура полностью асинхронна. – Akasha

ответ

1

Для этой цели я буду использовать Jasmine; Я не знаю, насколько хорошо вы используете эту библиотеку, но у них есть плагин для использования 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(); 
    }); 

});