Spy возвращает callcount 0 при использовании в качестве свойства объекта - PullRequest
1 голос
/ 13 марта 2019

Я пытаюсь написать тест, который проверяет, были ли вызваны функции библиотеки третьей части.

Тест: (мокко)

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 голосов
/ 13 марта 2019

Когда Promise разрешает, обратный вызов ставится в очередь в очереди PromiseJobs , которая обрабатывается после завершения текущего запущенного сообщения .

В этом случае ваши функции ставят обратные вызовы в очереди в PromiseJobs, и текущее текущее сообщение - сам тест , поэтому тест выполняется до завершения до того, как задания, поставленные в очередь в PromiseJobs, могут запустить .

Поскольку задания в 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
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...