使用Sinon将单元测试回调转换为Promise

问题描述 投票:0回答:1

所以我想通过对channel.sendToQueue进行存根测试来测试下面的功能,但是我不确定如何处理转换为Promise的回调。

const queMessage = async function(channel, queue, msg, opts={persistent: true})
{
    //Does not return promise from Amqplib so creating our own.
    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()
            }
        })
    })
}
javascript node.js unit-testing sinon
1个回答
0
投票

这是单元测试解决方案:

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 |                   
----------|---------|----------|---------|---------|-------------------
© www.soinside.com 2019 - 2024. All rights reserved.