Angular, как написать модульный тест для функции обратного вызова в обещании - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть компонент с методом, который отвечает за закрытие диалога.Метод закрытия диалога возвращает обещание.

closeDialogAction(callback: Function) {
    this.confirmationDialog.close(true).then(() => {
        callback();
    });
}

Как написать модульный тест, который будет проверять, был ли вызван обратный вызов?Я пытался так, но безуспешно.

it('should call callback function after close dialog', () => {
    const cb = jasmine.createSpy('cb');
    this.componentInstance.closeDialogAction(cb);
    expect(cb).toHaveBeenCalled();
});

1 Ответ

0 голосов
/ 21 февраля 2019

Если вы этого еще не сделали, вам нужно смоделировать функцию close() в подтверждение, так что он просто мгновенно возвращает разрешенное значение Promise.

Поскольку вы имеете дело с асинхронным кодом, вам нужно обернуть функцию подтверждения it в вызове fakeAsync.Это оборачивает ваш код подтверждения в специальную зону тестирования, которая имитирует асинхронное поведение для вас (для получения дополнительной информации см. документацию fakeAsync ).Тогда вам нужно всего лишь позвонить на tick, чтобы «продвинуть (виртуальные) часы».Это гарантирует, что вся асинхронная активность будет завершена после этого вызова.

Примерно так должен выглядеть ваш код:

it("should call callback", fakeAsync(() => {
    //todo: confirmationDialog should be injected by you via TestBed.get() or something similar
    spyOn(confirmationDialog, "close").and.returnValue(Promise.resolve(true));
    const spy = jasmine.createSpy();

    closeDialogAction(spy);

    tick();

    expect(spy).toHaveBeenCalled();
}));

Обратите внимание, что вам нужно создать экземпляр переменной translationDialog либо путем внедрения, либо вручную, в зависимости от вашей кодовой базы.

...