Jasmine test, если метод вызывает другой метод, только если внутренний метод является экземпляром функции

#javascript #angular #unit-testing #jasmine #karma-jasmine

#javascript #угловой #модульное тестирование #jasmine #карма-жасмин

Вопрос:

Мне нужно протестировать этот код с помощью jasmine@2.99.1

этот код из my-component.ts

 startChatting(agent, platform) {
  if (this.params.startChatting instanceof Function) {
    this.params.startChatting(agent, platform, this.params.rowIndex);
  }
}
  

и это моя попытка протестировать приведенный выше код: my-component.spec.ts

 it('ensure that startChatting does not call "params.startChatting" if "params.startChatting" 
   is not instanceOf Function', () => {
     component.params = {
       startChatting: null,
       rowIndex: 2
     }

     spyOn(component.params, 'startChatting');
     component.startChatting('dummyId', 'telegram');

     expect(component.params.startChatting).not.toHaveBeenCalled();
});
  

но тест завершается неудачей с этим сообщением «Ошибка: ожидаемый запуск spychatting не был вызван». что означает, что вызывается внутренний метод.

Поэтому я пытаюсь консольно зарегистрировать внутренний метод, для которого я установил значение null, как вы видите в начале моего тестового примера, но я обнаружил, что оно не равно null, вместо этого оно выглядит следующим образом:

 ƒ () { return fn.apply(this, arguments); }
  

и я знал, что это изменилось после вызова функции spyOn.

Итак, мой вопрос в том, как проверить такой случай? и мне нужно убедиться, что if params.startChatting не был экземпляром функции, не вызывался.

Заранее спасибо

Комментарии:

1. Вы не можете проверить этот случай. Ошибка связана с тем, что null не имеет типа Jasmine.spy … Вы можете протестировать с помощью getter параметр startChatting

2. спасибо @Akxe за ваш реплей, не могли бы вы объяснить, как протестировать с помощью getter или дать мне ссылку, которая объясняет это

Ответ №1:

Этот случай неразрешим, так как у вас нет функции для тестирования. Однако это может сработать для вас…

 let startChattingGetterInwoked = 0;
component.params = {
  get startChatting() {
    startChattingGetterInwoked  ;
    return null;
  },
  rowIndex: 2
}

component.startChatting('dummyId', 'telegram');
expect(startChattingGetterInwoked).toBe(1);
// Not sure how offten it is called, but at least one should be called due to `typeof`