我正在為以下檔案撰寫單元測驗案例
//filename: a.js
var amqp = require("amqplib"/span>)。
class RMQ {
constructor(connectionURI) {
this.URI = connectionURI;
}
async getInstance() {
var connection = await amqp.connect(this.URI) 。
this.connection = connection;
return connection。
}
}
const RMQ_INSTANCE = new RMQ(process. env.RMQ_URL)。)
module.exports = {
RMQ_INSTANCE,
};
我在下面的檔案中使用實體RMQ_INSTANCE
// fileename: b.js
const { RMQ_INSTANCE } = require("./a") 。
module.exports。 publishEmail = async function(message) {
var connection = await RMQ_INSTANCE.getInstance()。
var channel = await connection.createChannel()。
var exchange = "some_exchange"/span>;
var key = "some_key";
var msg = JSON.stringify(message)。
await channel.assertExchange(change, "topic", { durable。false })。)
await channel.publish(Exchange, key, Buffer.from(msg))。
setTimeout(function () {
connection.close()。
}, 500)。)
我使用proxyrequire來模擬RMQ_INSTANCE在b.js
// fileename: b.test.js
var proxyrequire = require("proxyquire").noCallThru()。
var sinon = require("sinon") 。
const { assert } = require("sinon") 。
class fakeRMQClass {
constructor(connectionURI) {
this.URI = connectionURI;
}
async getInstance() {
var connection = getFakeRMQStub()
return connection。
}
}
var producerTest = function () {
it("生產者連接-成功測驗", async function () {
var fakeRMQInstance = new fakeRMQClass("fake_url"/span>) 。
var rmqUtils = proxyrequire("./path/to/b.js", {
"./a"/span>: fakeRMQInstance
});
await rmqUtils.publishEmail("fake_msg") 。
});
afterEach(function (/span>) {
sinon.verifyAndRestore()。
});
};
describe("test_producer", producerTest) 。
但是我看到嘲諷并沒有正常作業。有誰能幫助我正確地模擬這個嗎?
uj5u.com熱心網友回復:
因為RMQ_INSTANCE是一個物件,你可以使用sinon.stub(obj, 'method')來存根其方法,你不需要使用proxyquire包。
由于你想測驗b模塊,b模塊只關心它所依賴的RMQ_INSTANCE的介面,具體實作并不重要。
b.js:
const { RMQ_INSTANCE } = require('./a') 。
module.exports。 publishEmail = async function (message) {
var connection = await RMQ_INSTANCE.getInstance()。
var channel = await connection.createChannel()。
var exchange = 'some_exchange'/span>;
var key = 'some_key';
var msg = JSON.stringify(message)。
await channel.assertExchange(change, 'topic', { durable。false })。)
await channel.publish(Exchange, key, Buffer.from(msg))。
setTimeout(function () {
connection.close()。
}, 500)。)
};
a.js:
class RMQ{
constructor(connectionURI) {
this.URI = connectionURI;
}
async getInstance() {}。
}
const RMQ_INSTANCE = new RMQ(process. env.RMQ_URL)。)
module.exports = { RMQ_INSTANCE };
b.test.js:
const sinon = require('sinon')。
const { RMQ_INSTANCE } = require(' ./a')。
const { publishEmail } = require('./b') 。
describe('test_producer', () => {
let clock;
before(() => {
clock = sinon.useFakeTimers()。
});
after(() => {
clock.restore()。
});
it('producer connection - success test', async () => {
const channelStub = {
assertExchange: sinon.stub().returnsThis() 。
publish: sinon.stub()。
};
const connectionStub = { createChannel: sinon.stub() 。 resolves(channelStub), close: sinon.stub() };
sinon.stub(RMQ_INSTANCE, 'getInstance').resolves(connectionStub)。
await publishEmail('fake message')。
sinon.assert.calledOnce(RMQ_INSTANCE.getInstance) 。
sinon.assert.calledOnce(connectionStub.createChannel)。
sinon.assert.calledWithExactly(channelStub. assertExchange, 'some_exchange', 'topic', { durable。false })。)
sinon.assert.calledWithExactly(
channelStub.publish。
'some_exchange',
'some_key'。
Buffer.from(JSON.stringify('假訊息'))。
);
clock.tick(500)。
sinon.assert.calledOnce(connectionStub.close)。
});
});
測驗結果:
test_producer
生產者連接--成功測驗
1通過 (10ms)
----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs title class_">Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|-------------------
All files | 100 | 100 | 75 | 100 !
a.js | 100 | 100 | 50 | 100 !
b.js | 100 | 100 | 100 !
----------|---------|----------|---------|---------|-------------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/310307.html
標籤:
上一篇:在另一個Bean的建構式中存根被注入的Bean的方法
下一篇:官員的Salesforce測驗
