Как протестировать обратный вызов с помощью Jasmine в Angular

#javascript #angular #unit-testing #callback #jasmine

Вопрос:

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

Это то, что я хочу проверить:

 @Injectable({
  providedIn: 'root'
})
export class CloseConnectionHandlerService {
  constructor(
    private signalRService: SignalRService) {
  }

  public initialize(): void {
    this.signalRService.hubConnection?.onclose((error: any) => {
      if (error) {
        console.error(error);
      }
    });
  }
}
 

Я пытаюсь использовать следующий код:

 describe('CloseConnectionHandlerService', () => {
  let service: CloseConnectionHandlerService;
  let signalRServiceSpy: jasmine.SpyObj<SignalRService>;
  
  beforeEach(() => {
    signalRServiceSpy = {
      ...jasmine.createSpyObj('SignalRService', ['']),
    } as jasmine.SpyObj<SignalRService>;

    TestBed.configureTestingModule({
      providers: [
        {provide: SignalRService, useValue: signalRServiceSpy},
      ]
    });

    service = TestBed.inject(CloseConnectionHandlerService);
  });
  
  describe('#initialize', () => {
    it('should log error to the console', () => {
      // Arrange
      spyOn(console, 'error');

      const hubConnectionStartSpy = jasmine.createSpyObj(HubConnection, ['onclose']);
      hubConnectionStartSpy.onclose.and.callFake(() => 'Error!');
      signalRServiceSpy.hubConnection = hubConnectionStartSpy

      // Act
      service.initialize();

      // Assert
      expect(console.error).toHaveBeenCalled();
    });
  });
});
 

Когда я запускаю это, я получаю сообщение об ошибке, что console.error не был вызван. У кого-нибудь есть идеи, как я могу это проверить?

Ответ №1:

this.signalRService.hubConnection?.onclose() метод принимает параметр обратного вызова. Таким образом, поддельная реализация, созданная .callFake() методом, переопределит исходную реализацию, и вы сможете получить исходную функцию обратного вызова в тестовом примере. Затем вызовите его с поддельной ошибкой вручную.

Напр.

 const hubConnectionStartSpy = jasmine.createSpyObj('HubConnection', ['onclose']);

hubConnectionStartSpy.onclose.and.callFake((callback) =>
  callback('Error!'); // You will get the original callback here, invoke it with fake error.
);