2016-04-22 81 views
1

我想通过使用Sinon.js对我的一个函数进行存根来测试async.waterfall用Sinon.JS拍摄async.waterfall

// functions.js 
module.exports = { 
    // function I don't want to run 
    doBigThing: function() { 
    console.log("[doBigThing] was called"); 
    }, 

    // function I want to stub 
    myFunction: function(number, callback) { 
    console.log("[myFunction] was called"); 
    doBigThing(); 
    callback(null, number); 
    }, 

    // function I want to test 
    waterfall: function(callback) { 
    return async.waterfall([ 
     async.constant(5), // 5 just for the demo 
     myFunction 
    ], callback); 
    } 
} 

而且我的测试是:

describe('water', function() { 
    it ('successfully falls', function() { 
    // function under test 
    var waterfall = functions.waterfall; 

    var callback = function(err, number) { 
     expect(err).to.be.null; 
     expect(number).to.equal(5); 
    }; 

    // I would like this stub to run instead of functions.myFunction 
    sinon.stub(functions, 'myFunction', function(number, callback) { 
     console.log("[myFunction] stub was called"); 
     callback(null, number); 
    }); 

    waterfall(callback); 
    // I suppose this is happening: myFunction(5, callback) 
    expect(functions.myFunction.withArgs(5, callback)).to.have.been.called; 
    expect(callback).to.have.been.called; 
    }); 
}); 

所以测试通过了,但存根被忽略,因为doBigThing被称为:

Water 
    ✓ successfully falls 
[myFunction] was called 
[doBigThing] was called 

相反,我想看看

Water 
    ✓ successfully falls 
[myFunction] stub was called 

I a我可能错过了一些东西,我会很感激你的帮助。

回答

1

你磕碰functions对象的方法myFunction,但在waterfall方法你调用一个myFunction功能(其实我不能在我的环境中运行你的代码,我得到“的ReferenceError:myFunction是没有定义“)。所以这应该工作:

// functions.js 
var functions = { 
    // function I don't want to run 
    doBigThing: function() { 
    console.log("[doBigThing] was called"); 
    }, 

    // function I want to stub 
    myFunction: function(number, callback) { 
    console.log("[myFunction] was called"); 
    functions.doBigThing(); // CHANGE HERE 
    callback(null, number); 
    }, 

    // function I want to test 
    waterfall: function(callback) { 
    return async.waterfall([ 
     async.constant(5), // 5 just for the demo 
     functions.myFunction // CHANGE HERE 
    ], callback); 
    } 
}; 

module.exports = functions; 
+0

我运行代码,我得到你想要的结果: ✓成功落下 [myFunction的]存根被称为 – jkondratowicz