我如何用 Jasmine 和 Karma 覆盖承诺响应

How can i coverage a promise response with Jasmine and Karma

我有一个函数 return 处理一个承诺,我需要覆盖 then 里面的 return 但我不知道我该怎么做,我目前正在尝试如下:

    confirmRemoveUser(user: IUser) {
    this.modalService
        .open('Confirma a exclusão do usuário selecionado?', {
            titleText: 'Confirmando exclusão',
            confirmButtonText: 'Sim',
            cancelButtonText: 'Cancelar',
            closeButtonText: 'Fechar',
            buttonType: 'danger'
        })
        .result.then(
            (result: BentoModalConfirmationCloseReason) => {
                if (result === BentoModalConfirmationCloseReason.Confirm) {
                    if (this.removeUser(user)) {
                        this.toastService.open('Usuário excluído com sucesso!', { type: 'success', close: true });
                    } else {
                        this.toastService.open('Falha ao excluir o usuário!', { type: 'warning', close: true, duration: 0 });
                    }
                }
            }
        );
}

我目前正在使用 callthrough () 并想象通过一些参数我可以获得承诺,但我不知道如何:

   it('Given_ConfirmRemoveUser_When_UserStepIsCalled_Then_UserIsRemoved', (done) => {

        component.selectedJob = {
        };

        component.selectedArea = {
        };

        component.users = [{
        }];

        spyOn(modalService, 'open').withArgs('This is modal msg').and.callThrough();

        component.confirmRemoveUser(component.users[0]);

        expect(modalService.open).toHaveBeenCalled();
        done();
    });

我的报道如下图:

Image here!

更新

New Error

按如下方式重写后,您的测试应该可以正常工作:

it('Given_ConfirmRemoveUser_When_UserStepIsCalled_Then_UserIsRemoved', (done) => {
    spyOn(modalService, 'open').and.returnValue(Promise.resolve(BentoModalConfirmationCloseReason.Confirm));
    spyOn(toastService, 'open').and.stub();

    component.confirmRemoveUser(component.users[0])
      .then(r => {
        expect(toastService.open).toHaveBeenCalled();
        done();
      })
      .catch(e => fail(e));
});

您可能还想知道吐司中会显示什么。因此,使用 expect(toastService.open).toHaveBeenCalledWith(?);.

更有意义

更新 以上解决方案仅在 confirmRemoveUser 会 return 和 Promise 时有效。

confirmRemoveUser(user: IUser) {
    return this.modalService
    ...

在您的情况下,使用 done 函数没有任何意义。您需要使用 asyncawait

it('Given_ConfirmRemoveUser_When_UserStepIsCalled_Then_UserIsRemoved', async () => {
    spyOn(modalService, 'open').and.returnValue(Promise.resolve(BentoModalConfirmationCloseReason.Confirm));
    spyOn(toastService, 'open').and.stub();

    await component.confirmRemoveUser(component.users[0]);

    expect(toastService.open).toHaveBeenCalled();
});

同样可以用 fakeAsyncflush 来实现。

import { fakeAsync, flush } from '@angular/core/testing';
...
it('Given_ConfirmRemoveUser_When_UserStepIsCalled_Then_UserIsRemoved', fakeAsync(() => {
    spyOn(modalService, 'open').and.returnValue(Promise.resolve(BentoModalConfirmationCloseReason.Confirm));
    spyOn(toastService, 'open').and.stub();

    component.confirmRemoveUser(component.users[0]);
    flush();

    expect(toastService.open).toHaveBeenCalled();
}));