用于sinon.stub()
存根$.getJSON()
方法及其JQuery.jqXHR
具有.done()
和.fail()
回调的返回值。您可以通过使用方法获取原始回调.callsFake()
,获取它们后,使用模拟数据或错误手动调用这些回调。
你不需要使用proxyquire
包。
例如
index.js
:
const $ = require('jquery');
const Progress = (() => {
const getData = () => {
return $.getJSON();
};
const showProgressBars = () => {
getData()
.done(function (data) {
console.log(data);
})
.fail(function (e) {
console.log('error getting data.', e);
});
};
return {
getData,
showProgressBars,
};
})();
module.exports = Progress;
index.test.js
:
const sinon = require('sinon');
const expect = require('chai').expect;
const $ = require('jquery');
const { getData, showProgressBars } = require('./');
describe('Progress', () => {
afterEach(() => {
sinon.restore();
});
it('should call getJSON', async () => {
const data = 'teresa teng';
const getJSONStub = sinon.stub($, 'getJSON').resolves(data);
const res = await getData();
expect(res).to.be.equal('teresa teng');
sinon.assert.calledOnce(getJSONStub);
});
it('should get data success', () => {
const data = 'teresa teng';
const mJqXHR = {
done: sinon.stub().callsFake(function (callback) {
callback(data);
return this;
}),
fail: sinon.stub(),
};
const getJSONStub = sinon.stub($, 'getJSON').returns(mJqXHR);
showProgressBars();
sinon.assert.calledOnce(getJSONStub);
sinon.assert.calledWithExactly(mJqXHR.done, sinon.match.func);
});
it('should handle error if get data fail', () => {
const mErr = new Error('network');
const mJqXHR = {
done: sinon.stub().returnsThis(),
fail: sinon.stub().callsFake(function (callback) {
callback(mErr);
}),
};
const getJSONStub = sinon.stub($, 'getJSON').returns(mJqXHR);
showProgressBars();
sinon.assert.calledOnce(getJSONStub);
sinon.assert.calledWithExactly(mJqXHR.fail, sinon.match.func);
});
});
单元测试结果:
Progress
✓ should call getJSON
teresa teng
✓ should get data success
error getting data. Error: network
at Context.<anonymous> (/Users/dulin/workspace/github.com/mrdulin/expressjs-research/src/stackoverflow/67267452/index.test.js:34:18)
at callFn (/Users/dulin/workspace/github.com/mrdulin/expressjs-research/node_modules/mocha/lib/runnable.js:364:21)
at Test.Runnable.run (/Users/dulin/workspace/github.com/mrdulin/expressjs-research/node_modules/mocha/lib/runnable.js:352:5)
at Runner.runTest (/Users/dulin/workspace/github.com/mrdulin/expressjs-research/node_modules/mocha/lib/runner.js:677:10)
at /Users/dulin/workspace/github.com/mrdulin/expressjs-research/node_modules/mocha/lib/runner.js:801:12
at next (/Users/dulin/workspace/github.com/mrdulin/expressjs-research/node_modules/mocha/lib/runner.js:594:14)
at /Users/dulin/workspace/github.com/mrdulin/expressjs-research/node_modules/mocha/lib/runner.js:604:7
at next (/Users/dulin/workspace/github.com/mrdulin/expressjs-research/node_modules/mocha/lib/runner.js:486:14)
at Immediate._onImmediate (/Users/dulin/workspace/github.com/mrdulin/expressjs-research/node_modules/mocha/lib/runner.js:572:5)
at processImmediate (internal/timers.js:461:21)
✓ should handle error if get data fail
3 passing (12ms)
----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|-------------------
All files | 100 | 100 | 100 | 100 |
index.js | 100 | 100 | 100 | 100 |
----------|---------|----------|---------|---------|-------------------