【问题标题】:unit testing in javascript: how do you mock? - a (hard for me) examplejavascript中的单元测试:你如何模拟? - 一个(对我来说很难)例子
【发布时间】:2012-02-13 21:45:20
【问题描述】:

我只是重写了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,并认为可以使用模拟我拥有的所有对象来测试所有内容,直到我最终也模拟了集合,但这似乎非常笨拙。有人可以帮我写上面的测试吗,我很乐意写一个教程?

【问题讨论】:

  • 集合和模型是如何传递到更新类的?
  • 你可以看到对_withCollection的调用。实际上,我设置了一个this.collectionName 变量,_withCollection 检索给定名称的集合,并使用返回的集合调用回调。这是 node.js 的常用方法。由于框架是完全异步的,因此您在任何地方都使用回调。

标签: javascript unit-testing jasmine qunit vows


【解决方案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();
   });

});

【讨论】:

    猜你喜欢
    • 2013-03-20
    • 2013-11-13
    • 2021-08-27
    • 2011-12-16
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多