Сервис тестирования с зависимостями - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь настроить тест для моей службы с помощью TestBed. Этот сервис имеет некоторые зависимости от других сервисов. Я создал файлы .stub для этих зависимостей и экспортировал их. Проблема в том, что когда я пытаюсь использовать эти заглушки в тесте, кажется, что методы тестирования используют реальный сервис, а не тест. Вот мои настройки (поддельные имена только для этой темы):

describe('ServiceToTest', () => {
    let stubbedService: ServiceDependency1;

    beforeEach(() => {
        TestBed.configureTestingModule({
            imports: [],
            providers: [
                ServiceToTest,
                { provide: ServiceDependency1, useClass: ServiceDependency1Stub },
                { provide: ServiceDependency2, useClass: ServiceDependency2Stub }
            ]
        });

        stubbedService = TestBed.inject(ServiceDependency1);
    });

    it('description', fakeAsync(() => {
        // Error appears here when trying to use the BehaviorSubject on the mock:
        // Property 'behaviorSubjectTest' does not exist on type                 
       'ServiceDependency1'
        stubbedService.behaviorSubjectTest.next(new Test());
        ... more logic
    }));
});

Я понимаю ошибку, потому что свойство behaviorSubjectTest находится на заглушке, а не на реальной службе. Но почему он не использует сервис-заглушку, когда я указал его как useClass в поставщиках?

Что я делаю не так? Когда я вижу, что доступно на serviceDependency1Stub, я вижу все методы и свойства реального сервиса, а не заглушки. Это произошло после обновления до Angular 9. Раньше мы использовали метод .get, а затем он работал. Затем он был настроен так:

describe('ServiceToTest', () => {
    beforeEach(() => {
        TestBed.configureTestingModule({
            imports: [],
            providers: [
                ServiceToTest,
                { provide: ServiceDependency1, useClass: ServiceDependency1Stub },
                { provide: ServiceDependency2, useClass: ServiceDependency2Stub }
            ]
        });
    });

    it('description', fakeAsync(() => {
        const stubbedService = TestBed.get(ServiceDependency1);
        stubbedService.behaviorSubjectTest.next(new Test());
        ... more logic
    }));
});

А вот файл .stub:

export class ServiceDependency1Stub {
    public behaviorSubjectTest = new BehaviorSubject<Test>(null);
}

Я полагаю, что установка при запуске была неправильной, но до этого не выставлялась после изменения на .inject? Я посмотрел документацию, но не могу найти хороших примеров тестирования сервиса с зависимостями. Если бы кто-нибудь мог помочь мне и указать мне правильное направление, я был бы признателен за это. Спасибо.

...