使用 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
我正在尝试使用 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