我想在我的sails.js 應用程式中使用Mocha(測驗框架)和Sinon(測驗雙庫)對一個函式進行單元測驗。這就是被測函式的樣子
function saveNotifications(notificationData, cb){
checkForDuplicates(notificationData, (err, isDuplicate) => {
if(isDuplicate) return updateNotification(notificationData, (err, updatedData)=> { cb(err, updatedData) })
// No duplicate exists, so save the notification in db
Notification.create(notification).exec((err, savedData) => {
return cb(err, savedData)
})
})
})
盡管我能夠偽造checkForDuplicates并為此添加一些測驗。但是當我想存根(或偽造)Notification.create(notification).exec方法以檢查是否為特定測驗用例呼叫了一次 create 方法時,我無法弄清楚如何做到這一點。我既不了解如何對鏈式方法進行存根,也無法對簡單Notification.create物件本身進行存根。我假設我對如何存根水線方法實體的理解存在一些差距。感謝任何幫助/建議。
我試過的
我首先嘗試做更簡單的事情,即存根創建方法
it('#saveNotifications({userId: "1", message: "Test message"}, cb)', (done) => {
sinon.stub(Notification, 'create');
saveNotifications({userId: "1", message: "Test message"}, (err, result) => {
try {
expect(err).to.not.throw;
expect(err).to.be.null;
expect(result).to.be.not.null;
sinon.assert.calledOnce(Notification.create);
sinon.restore();
done();
} catch(e){
sinon.restore();
done(e);
}
})
但這給出了錯誤
TypeError: Cannot stub non-existent property create
uj5u.com熱心網友回復:
你提到了兩個問題,我們來一一梳理
- 存根簡單的 Notification.create 物件?
您已經為此撰寫了正確的代碼,但您沒有參考正確的模型物件。代替Notification物件,使用sails.models.notificationie
sinon.stub(sails.models.notification, 'create')
- 如何存根鏈式方法
偽造回傳值并在回傳函式中使用存根,即
sinon.stub(sails.models.notification, 'create').callsFake(function(){
return {
exec: theStubbedChainFunction
}
})
var theStubbedChainFunction = sinon.stub().yields(null, { id: '1', message: 'canned response'})
// Then you can assert to test
sinon.assert.calledOnce(theStubbedChainFunction)
如果您有更多鏈式功能(例如Notification.update(criteria).set(valuedToUpdate).fetch().exec(function(err, updatedRecords){...}),您可以遵循相同的原則,例如
sinon.stub(sails.models.notification, 'update').callsFake(function(){
return {
set: sinon.stub().callsFake(function(){
return {
fetch: sinon.stub().callsFake(function(){
exec: theStubbedChainFunction
})
}
})
}
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/523261.html
