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');
并执行您需要的任何断言逻辑。
我正在尝试测试某个函数是否在回调中被调用,但是我不明白如何包装外部函数。我使用 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');
并执行您需要的任何断言逻辑。