我刚刚重写了主干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());
});
}
});
},
这段代码没有什么特别之处。它使用节点mongodb本地驱动程序,并更新数据库中的一条记录。AFAIK,适当的测试意味着至少要检查(1)collection.update
是用给定的参数调用的,(2)callback
是在什么时候以及应该如何调用,(3)模型包含新数据。
有了誓言,我可以检查(2),但根本不知道如何检查(1)。事实上,我所知道的每一个单元测试框架,qUnit,Jasmine也是如此。我相信这是可以做到的,我决定至少学习其中一个,但当你一开始陷入困境时,很难做出选择。:)
我知道sinon.js,并认为每件事都可以通过嘲笑我所有的对象来测试,直到我最终也嘲笑了这个集合,但这似乎非常笨拙。有人能帮我写上面的测试吗?我很乐意写一个教程?
我会为此使用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();
});
});