Как проверить результаты подсмотренной функции (callThrough) - PullRequest
0 голосов
/ 04 марта 2019

Я хочу проверить / утвердить результаты подсмотренной функции.Я использую фреймворк nestjs с жасмином.Я создаю шпион Жасмин на метод, который я хочу «шпионить», то есть подслушивать аргументы и ответ / исключение.Однако я не могу получить доступ к возвращаемому значению метода spied.

Допустим, у меня есть эмиттер и прослушиватель, и я хочу утверждать, что мой прослушиватель выдает исключение при сбое операции БД.

Слушатель:

  onModuleInit() {
    this.emitter.on('documentDeleted', d => this.onDocumentDeleted(d));
  }

  @CatchAndLogAnyException()
  private async onDocumentDeleted(dto: DocumentDeletedEventDTO) {
    this.logger.log(`Deleting document with id '${dto.id}'...`);

    const result = await this.ResearchHearingTestModel.deleteOne({ _id: dto.id });
    if (!result.ok) {
      throw new DataAccessException(
        `Deleting document with id '${dto.id}' failed. Model.deleteOne(id) result: ${result}`,
      );
    }
    if (result.n < 1) {
      throw new DocumentNotFoundException(`Deleting document with id '${dto.id}' failed.`);
    }

    this.logger.log(`Deleted document with id '${dto.id}.`);
  }

Тест:

      const mockId = 123;
      const spyDelete = spyOn(model, 'deleteOne').and.returnValue({ ok: 1, n: 0 });
      const spyOnDeleted = spyOn(listener, 'onDocumentDeleted');
      spyOnDeleted.and.callThrough();

      await emitter.emit('documentDeleted', new DocumentDeletedEventDTO(mockId));

      expect(spyOnDeleted).toHaveBeenCalledTimes(1);
      expect(spyDelete).toHaveBeenCalledTimes(1);
      expect(spyDelete).toHaveBeenCalledWith(expect.objectContaining({ _id: mockId }));
      expect(spyOnDeleted).toThrow(DocumentNotFoundException);

Итак, при отладке я вижу, spyOnDeleted["[[Scopes]]"][0].spy.calls.mostRecent["[[Scopes]]"][0].calls[0].returnValue - это обещание, которое я, вероятно, ищу, но не могу получить к нему доступ илипроверьте это.

И когда я запускаю тест, это вывод:

    expect(received).toThrow(expected)

    Expected name: "DocumentNotFoundException"

    Received function did not throw

       95 |       expect(spyDelete).toHaveBeenCalledTimes(1);
       96 |       expect(spyDelete).toHaveBeenCalledWith(expect.objectContaining({ _id: mockId }));
    >  97 |       expect(spyOnDeleted).toThrow(DocumentNotFoundException);
          |                            ^
       98 |     });
       99 |   });
      100 | });

Я видел Введенный в CallThrough шпион и несколько других вопросов, которыепохоже, но я все еще надеюсь, что можно шпионить за методами callThrough и подслушивать их.Есть предложения?

1 Ответ

0 голосов
/ 04 марта 2019

toThrow нельзя использовать для шпионов.Вы можете использовать шпионов, чтобы смоделировать поведение или использовать фактическое поведение с callThrough, а затем убедиться, что метод был вызван с определенными параметрами.Но у шпиона не будет информации о полученном результате (значение или ошибка), поэтому вы не можете установить на него ожидания.

Если вы хотите проверить поведение onDocumentDeleted, вы должны либо косвенно проверить его,наблюдая за эффектами метода.В твоем случае (с @CatchAndLogAnyException) вроде пиши в лог !?Таким образом, вы можете следить за журналом и ожидать, что он будет вызван с сообщением об ошибке.Или же вы можете протестировать метод напрямую, сделав его общедоступным.

...