簡體   English   中英

Javascript sinon測試回調

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM