间谍用作对象属性时返回callcount 0

时间:2019-03-13 16:15:29

标签: typescript unit-testing mocha sinon

我正在尝试编写测试,以检查是否已调用了第三方库函数。

测试:(摩卡咖啡)

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()已被调用,但是测试不想证明这一点,有人会帮助我可怜的灵魂吗?:)

1 个答案:

答案 0 :(得分:0)

Promise解决后,回调将在PromiseJobs queue中排队,而https on the Load Balancer在当前运行的消息完成后将得到处理

在这种情况下,您的函数正在PromiseJobs中排队回叫,而当前正在运行的消息是测试本身,因此,在PromiseJobs中排队的作业有机会运行之前,测试将完成 / em>。

由于PromiseJobs中的作业尚未运行,因此由于尚未调用channelSpy,因此测试失败。


Promise返回的init已链接到Promisesconnect返回的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
});