在Nodejs中存根一个函数

时间:2014-08-18 05:24:36

标签: node.js

我有一个模型将数据存储到db中,然后通过传递刚刚创建的id

来调用另一个存储方法
 //db.Poll.store method  

 store: function (opt, db, callback) {
            var pollData = {
                question: opt.data.question
            };

            db.Poll.create(pollData).success(function (poll) {
                opt.data.PollId = poll.id;
                models.PollOption.store(opt, db, callback);
            }).error(function(error) {
                callback(error, null);
            });
        }

我只想进行单元测试,以确保将有效的opt.data.PollId传递给models.PollOption.store()方法,我不想检查models.PollOption.store()行为是否正确,所以我嘲笑/覆盖了models.PollOption.store方法。我的单元测试如下所示

describe('Method store', function () {
    it('should be able to create a poll and pass poll.id to pollOption.store', function (done) {
        var opt = {
            data: {
                question: "Do you love nodejs?"
            }
        };

        var temp = db.PollOption.store;
        //mock function
        db.PollOption.store = function (opt, db, callback) {
            expect(opt.data.PollId).not.to.be.empty
            //restore to what it was before
            db.PollOption.store = temp;
            callback();
        };

        db.Poll.store(opt, db, done);
    });
});

我可以通过使用sinon.js,stub db.PollOption.store方法实现这一目的吗?

1 个答案:

答案 0 :(得分:1)

我使用了另一个测试框架,因为我没有完整的代码,所以这里有一个如何使用sinon.spy的例子

基本上,eq(1,opt)表示期望(opt).equal.to(1)

var method = { store : function(a){
  return a+1
}}

tests({
   'should be able to create a poll and pass poll.id to pollOption.store': function () {
      sinon.spy(method, "store")              // create spy
      method.store({opt:1})                   // call your function
      var spyCall = method.store.getCall(0)   // sinon spy API .getCall(0)
                                              // i assume this is the [objects] 
                                              // created by the spy on calling method()
      eq(1, spyCall.args[0].opt)              // your expect()
    }
});