[英]Javascript sinon testing callback
我正在嘗試測試某個函數在回調中被調用,但是我不知道如何包裝外部函數。 我將mocha用作測試套件,將chai用作斷言庫,並使用sinon進行偽造。
fileToTest.js
const externalController = require('./externalController');
const processData = function processData( (req, res) {
externalController.getAllTablesFromDb( (errors, results) => {
// call f1 if there are errors while retrieving from db
if (errors) {
res.f1();
} else {
res.f2(results);
}
)};
};
module.exports.processData = processData;
最后,我需要驗證getAllTablesFromDb中是否有錯誤,將調用res.f1,如果沒有錯誤,則將調用res.f2。
從該代碼段可以看出externalController.getAllTablesFromDb是一個帶有回調的函數,在這種情況下,我使用箭頭函數創建了該回調。
有人可以解釋一下我如何強制getAllTablesFromDb回調失敗或成功,以便我可以使用間諜或模擬程序來驗證是否調用了f1或f2嗎?
var errorSpy = sinon.spy(res, "f1");
var successSpy = sinon.spy(res, "f2");
// your function call
// error
expect(errorSpy.calledOnce);
expect(successSpy.notCalled);
// without errors
expect(errorSpy.notCalled);
expect(successSpy.calledOnce);
一種可能的解決方案是提取回調,然后將其強制沿失敗或成功的預期路徑進行。 可以使用名為proxyquire的npm軟件包來完成此提取。 通過從文件開頭刪除require行來提取回調,然后:
const proxyquire = require('proxyquire');
const externalController = proxyquire('path to externalController',
'path to externalController dependency', {
functionToReplace: (callback) => { return callback }
}
});
const extractedCallback = externalController.getAllTablesFromDb(error, results);
然后,您可以使用所需的參數來調用extractedCallback。
extractedCallback(myArg1, myArg2);
並在res.f1和res.f2上設置間諜
sinon.spy(res, 'f1');
並執行您需要的任何斷言邏輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.