我正在尝试编写测试,以检查是否已调用了第三方库函数。
测试:(摩卡咖啡)
describe('SomeClassTest', () => {
describe('Setup', () => {
beforeEach(() => {
const channel = {createChannel: () => 'channel created'};
// @ts-ignore
this.channelSpy = Sinon.spy(channel, 'createChannel');
// @ts-ignore
Sinon.stub(amqplib, 'connect').returns(channel);
});
// @ts-ignore
afterEach(() => amqplib.connect.restore());
it('Should check if SomeClass has created Channel', () => {
const someclass = SomeClass.getInstance();
someclass.init();
// @ts-ignore
expect(amqplib.connect.callCount).to.be.eq(1); // True
// @ts-ignore
expect(this.channelSpy.callCount).to.be.eq(1); // False :(
});
});
});
课程:
export default class SomeClass {
private connection?: amqplib.Connection;
public async init() {
await this.connect();
await this.createChannel();
}
private async connect(): Promise<void> {
this.connection = await amqplib.connect(this.connectionOptions);
}
private async createChannel(): Promise<void> {
if (!this.connection) {
throw new Error('Some Error :)');
}
this.channel = await this.connection.createChannel();
}
}
我确定this.connection.createChannel()已被调用,但是测试不想证明这一点,有人会帮助我可怜的灵魂吗?:)
答案 0 :(得分:0)
当Promise
解决后,回调将在PromiseJobs queue中排队,而https on the Load Balancer在当前运行的消息完成后将得到处理 。
在这种情况下,您的函数正在PromiseJobs中排队回叫,而当前正在运行的消息是测试本身,因此,在PromiseJobs中排队的作业有机会运行之前,测试将完成 / em>。
由于PromiseJobs中的作业尚未运行,因此由于尚未调用channelSpy
,因此测试失败。
由Promise
返回的init
已链接到Promises
和connect
返回的createChannel
,因此您要做的就是使测试函数生效async
,然后在await
返回的Promise
上调用init
:
it('Should check if SomeClass has created Channel', async () => { // async test function
const someclass = SomeClass.getInstance();
await someclass.init(); // await the Promise returned by init
// @ts-ignore
expect(amqplib.connect.callCount).to.be.eq(1); // True
// @ts-ignore
expect(this.channelSpy.callCount).to.be.eq(1); // True
});