#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.
);