我有一个具有异步功能的中介者times.js文件,如下所示。在运行Mocha Chai单元测试时,不会发生processTimes()的存根。不知道出了什么问题。感谢您的帮助。
async function getTimes (request, response) {
let slots;
.....
slots = await processTimes(params, promises);
.....
response.status(200).json(slots);
}
async function processTimes (params, promises) {
return Promise.all(promises).then(function (data) {
return slots;
}
}
和如下测试spec times_spec.js。
const chai = require("chai");
const sinon = require("sinon");
const timesMediator = require("times");
describe("times mediator", function () {
var mockResponse = {
set: (key, value) => {
},
status: function (code) {
return {
json: function (json) {
expect(json).not.to.be.empty;
... //some assertions here.
},
};
},
};
beforeEach(function () {
});
afterEach(function (done) {
sinon.restore();
done();
});
it("times", async () => {
sinon.stub(timesMediator, "processTimes").resolves({"a":"A","b":"B"}});
}
timesMediator.getTimes(mockRequest, mockResponse);
}
这里是单元测试解决方案:
index.ts
:
exports.getTimes = async function getTimes(request, response) {
let slots;
const params = {};
const promises = [Promise.resolve(1), Promise.resolve(2)];
slots = await exports.processTimes(params, promises);
response.status(200).json(slots);
};
exports.processTimes = async function processTimes(params, promises) {
return Promise.all(promises);
};
index.spec.ts
:
import sinon from 'sinon';
const timesMediator = require('./');
import { expect } from 'chai';
describe('timesMediator', () => {
afterEach(() => {
sinon.restore();
});
it('#getTimes', async () => {
const mProcessTimesResponse = [{ a: 'A', b: 'B' }] as any;
const mReq = {};
const mRes = {
status: sinon.stub().returnsThis(),
json: sinon.stub()
};
const stub = sinon.stub(timesMediator, 'processTimes').resolves(mProcessTimesResponse);
await timesMediator.getTimes(mReq, mRes);
expect(stub.calledWith({}, sinon.match.array)).to.be.true;
expect(mRes.status.calledWith(200)).to.be.true;
expect(mRes.json.calledWith(mProcessTimesResponse)).to.be.true;
});
it('#processTimes', async () => {
const actualValue = await timesMediator.processTimes({}, [Promise.resolve(1)]);
expect(actualValue).to.eql([1]);
});
});
单元测试结果覆盖率100%:
timesMediator
✓ #getTimes
✓ #processTimes
2 passing (13ms)
---------------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
---------------|----------|----------|----------|----------|-------------------|
All files | 100 | 100 | 100 | 100 | |
index.spec.ts | 100 | 100 | 100 | 100 | |
index.ts | 100 | 100 | 100 | 100 | |
---------------|----------|----------|----------|----------|-------------------|
源代码:https://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/stackoverflow/57586444