使用 mocha 在 node.js 中编写单元测试用例来模拟 azure 服务总线队列

Writing a unit test case in node.js using mocha to mock a azure service bus queue

我正在尝试使用 mocha 框架编写单元测试用例,我必须在其中通过传递连接字符串和队列名称来模拟 azure 服务总线队列...有人可以帮助我了解如何为单元模拟队列使用 node.js.

的测试用例目的
async function pushToQueue(messages, ctx) {
    context = ctx;
    const { ServiceBusClient } = require("@azure/service-bus");
    const connectionString = process.env['serviceBusConnectionString'];
    const queueName = process.env['serviceBusQueueName'];

    const sbClient = ServiceBusClient.createFromConnectionString(connectionString);
    const queueClient = sbClient.createQueueClient(queueName);
    const sender = queueClient.createSender();

    try {
        for (let i = 0; i < messages.length; i++) {
            const message = {
                body: messages[i]
            }
            await sender.send(message);
            //await test(message);
        }
        await queueClient.close();
    } finally {
        await sbClient.close();
    }
    return messages.length
}
module.exports = { pushToQueue}

您应该使用 stub/mocking 库,例如 sinon.js。这是单元测试:

index.js:

async function pushToQueue(messages, ctx) {
  context = ctx;
  const { ServiceBusClient } = require('@azure/service-bus');
  const connectionString = process.env['serviceBusConnectionString'];
  const queueName = process.env['serviceBusQueueName'];

  const sbClient = ServiceBusClient.createFromConnectionString(connectionString);
  const queueClient = sbClient.createQueueClient(queueName);
  const sender = queueClient.createSender();

  try {
    for (let i = 0; i < messages.length; i++) {
      const message = {
        body: messages[i],
      };
      await sender.send(message);
    }
    await queueClient.close();
  } finally {
    await sbClient.close();
  }
  return messages.length;
}

module.exports = { pushToQueue };

index.test.js:

const { pushToQueue } = require('.');
const sinon = require('sinon');
const { ServiceBusClient } = require('@azure/service-bus');

describe('60772165', () => {
  it('should push to queue', async () => {
    const sbClientStub = {
      createQueueClient: sinon.stub().returnsThis(),
      createSender: sinon.stub().returnsThis(),
      send: sinon.stub(),
      close: sinon.stub(),
    };
    sinon.stub(ServiceBusClient, 'createFromConnectionString').callsFake(() => sbClientStub);
    const messages = ['a', 'b'];
    const ctx = {};
    const actual = await pushToQueue(messages, ctx);
    sinon.assert.match(actual, 2);
    sinon.assert.calledWithExactly(ServiceBusClient.createFromConnectionString, undefined);
    sinon.assert.calledWithExactly(sbClientStub.createQueueClient, undefined);
    sinon.assert.calledOnce(sbClientStub.createSender);
    sinon.assert.calledWithExactly(sbClientStub.send.firstCall, { body: 'a' });
    sinon.assert.calledWithExactly(sbClientStub.send.secondCall, { body: 'b' });
    sinon.assert.calledTwice(sbClientStub.close);
  });
});

100% 覆盖率的单元测试结果:

  60772165
    ✓ should push to queue


  1 passing (14ms)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |     100 |      100 |     100 |     100 |                   
 index.js |     100 |      100 |     100 |     100 |                   
----------|---------|----------|---------|---------|-------------------

源代码:https://github.com/mrdulin/expressjs-research/tree/master/src/Whosebug/60772165