Вот решение для модульного теста:
index.ts
:
const logger = {
debug: console.log,
error: console.error,
verbose: console.log,
};
const queMessage = async function(channel, queue, msg, opts = { persistent: true }) {
return new Promise(function(resolve, reject) {
logger.debug('Queuing message on %s queue. %o, %o', queue, msg, opts);
channel.sendToQueue(queue, Buffer.from(msg), opts, (err, ok) => {
if (err) {
logger.error('Error pushing message to %s queue. %o', queue, err);
reject(err);
} else {
logger.verbose('Pushed message to %s queue successfully.', queue);
resolve();
}
});
});
};
export { queMessage, logger };
index.test.ts
:
import { queMessage, logger } from './';
import sinon from 'sinon';
import { expect } from 'chai';
describe('60531301', () => {
it('should send to queue successfully', async () => {
const channelStub = {
sendToQueue: sinon.stub().callsFake((queue, buffer, opts, callback) => {
callback(null, 'ok');
}),
};
const verboseLogSpy = sinon.spy(logger, 'verbose');
await queMessage(channelStub, 'queue', 'some message');
sinon.assert.calledWithExactly(verboseLogSpy, 'Pushed message to %s queue successfully.', 'queue');
});
it('should handle error if send to queue failure', async () => {
const mError = new Error('network');
const channelStub = {
sendToQueue: sinon.stub().callsFake((queue, buffer, opts, callback) => {
callback(mError, null);
}),
};
const errorLogSpy = sinon.spy(logger, 'error');
try {
await queMessage(channelStub, 'queue', 'some message');
} catch (error) {
expect(error).to.be.eql(mError);
}
sinon.assert.calledWithExactly(errorLogSpy, 'Error pushing message to %s queue. %o', 'queue', mError);
});
});
Результаты модульного теста со 100% покрытием:
60531301
Queuing message on queue queue. 'some message', { persistent: true }
Pushed message to queue queue successfully.
✓ should send to queue successfully
Queuing message on queue queue. 'some message', { persistent: true }
Error pushing message to queue queue. { Error: network
at /Users/ldu020/workspace/github.com/mrdulin/expressjs-research/src/stackoverflow/60531301/index.test.ts:18:20
at Generator.next (<anonymous>)
at /Users/ldu020/workspace/github.com/mrdulin/expressjs-research/src/stackoverflow/60531301/index.test.ts:8:71
at new Promise (<anonymous>)
at __awaiter (/Users/ldu020/workspace/github.com/mrdulin/expressjs-research/src/stackoverflow/60531301/index.test.ts:4:12)
at Context.it (/Users/ldu020/workspace/github.com/mrdulin/expressjs-research/src/stackoverflow/60531301/index.test.ts:17:65)
at callFn (/Users/ldu020/workspace/github.com/mrdulin/expressjs-research/node_modules/mocha/lib/runnable.js:387:21)
at Test.Runnable.run (/Users/ldu020/workspace/github.com/mrdulin/expressjs-research/node_modules/mocha/lib/runnable.js:379:7)
at Runner.runTest (/Users/ldu020/workspace/github.com/mrdulin/expressjs-research/node_modules/mocha/lib/runner.js:535:10)
at /Users/ldu020/workspace/github.com/mrdulin/expressjs-research/node_modules/mocha/lib/runner.js:653:12
at next (/Users/ldu020/workspace/github.com/mrdulin/expressjs-research/node_modules/mocha/lib/runner.js:447:14)
at /Users/ldu020/workspace/github.com/mrdulin/expressjs-research/node_modules/mocha/lib/runner.js:457:7
at next (/Users/ldu020/workspace/github.com/mrdulin/expressjs-research/node_modules/mocha/lib/runner.js:362:14)
at Immediate._onImmediate (/Users/ldu020/workspace/github.com/mrdulin/expressjs-research/node_modules/mocha/lib/runner.js:425:5)
at runCallback (timers.js:705:18)
at tryOnImmediate (timers.js:676:5)
at processImmediate (timers.js:658:5)
[stack]:
'Error: network\n at /Users/ldu020/workspace/github.com/mrdulin/expressjs-research/src/stackoverflow/60531301/index.test.ts:18:20\n at Generator.next (<anonymous>)\n at /Users/ldu020/workspace/github.com/mrdulin/expressjs-research/src/stackoverflow/60531301/index.test.ts:8:71\n at new Promise (<anonymous>)\n at __awaiter (/Users/ldu020/workspace/github.com/mrdulin/expressjs-research/src/stackoverflow/60531301/index.test.ts:4:12)\n at Context.it (/Users/ldu020/workspace/github.com/mrdulin/expressjs-research/src/stackoverflow/60531301/index.test.ts:17:65)\n at callFn (/Users/ldu020/workspace/github.com/mrdulin/expressjs-research/node_modules/mocha/lib/runnable.js:387:21)\n at Test.Runnable.run (/Users/ldu020/workspace/github.com/mrdulin/expressjs-research/node_modules/mocha/lib/runnable.js:379:7)\n at Runner.runTest (/Users/ldu020/workspace/github.com/mrdulin/expressjs-research/node_modules/mocha/lib/runner.js:535:10)\n at /Users/ldu020/workspace/github.com/mrdulin/expressjs-research/node_modules/mocha/lib/runner.js:653:12\n at next (/Users/ldu020/workspace/github.com/mrdulin/expressjs-research/node_modules/mocha/lib/runner.js:447:14)\n at /Users/ldu020/workspace/github.com/mrdulin/expressjs-research/node_modules/mocha/lib/runner.js:457:7\n at next (/Users/ldu020/workspace/github.com/mrdulin/expressjs-research/node_modules/mocha/lib/runner.js:362:14)\n at Immediate._onImmediate (/Users/ldu020/workspace/github.com/mrdulin/expressjs-research/node_modules/mocha/lib/runner.js:425:5)\n at runCallback (timers.js:705:18)\n at tryOnImmediate (timers.js:676:5)\n at processImmediate (timers.js:658:5)',
[message]: 'network' }
✓ should handle error if send to queue failure
2 passing (70ms)
----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|-------------------
All files | 100 | 100 | 100 | 100 |
index.ts | 100 | 100 | 100 | 100 |
----------|---------|----------|---------|---------|-------------------