Модульный тест не ведет себя для класса, который расширяет базовый класс - PullRequest
0 голосов
/ 23 апреля 2020

Я борюсь с тестом для класса компонента, который расширяет другой абстрактный класс.

Два класса следующие:

export abstract class BaseListComponent {
    constructor(
        protected someImportantService: SomeImportantService
    ){

    }

    handleListInitialization() {
        // Do lots of things
        this.doOtherStuff();
    }

    /**
     * @abstract doOtherStuff Function
     */
    protected abstract doOtherStuff( );
}


export class MyListComponent extends BaseListComponent {
    constructor(
        someImportantService: SomeImportantService,
        private listService: ListService
    ) {
        super( someImportantService );
    }

    doStuff = () => {
        this.handleListInitialization();
    }

    doOtherStuff(){
        this.listService.getThings().then(() => {
            // process response...
         })
    }
}

Я пытаюсь проверить это при вызове doStuff в MyListComponent это приведет к вызову listService.getThings() в методе * 1009. * В отчете показаны строки моей реализации doOtherStuff() полностью.

Если я вместо этого вызову doOtherStuff() в моем наборе тестов, то тест пройдёт просто отлично.

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

В чем здесь может быть проблема?

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Проблема в том, когда вызывается doOtherStuff, именно в этот момент вы подписываетесь / посещаете Обещание.

Если вы хотите получить значение this.listService.getThings(), вам нужно будет дождаться следующего Часы будут выполнены.

Чтобы справиться с этим, вы можете использовать fakeAysn c и галочку из Angular.

Я думаю, мы можем переписать ваш тест с помощью fakeAsyn c следующим образом:

describe('When calling doStuff()',() => {
        it('should call getThings from the ListService instance',  fakeAsync(() => {
            component.doStuff();
            tick();
            fixture.detectChanges();
            spyOn(component.listService, 'getThings').and.returnValue(Promise.then({foo: 'bar'}));
            tick();
            fixture.detectChanges();
            expect(component.listService.getThings).toHaveBeenCalled();
        }));
});

Это должно сработать.

0 голосов
/ 23 апреля 2020

вам нужно опубликовать больше кода, как вы создаете component, может быть, это издевается, в этом случае ожидается сбой. Классы и их наследство выглядят хорошо и должны пройти тест в описанных обстоятельствах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...