Angular - Компоненты модульного тестирования с зависимостями - Когда включать или имитировать - PullRequest
0 голосов
/ 17 июня 2020

Меня очень смущает то, как модульное тестирование компонента в Angular имеет некоторые зависимости. Если я включаю зависимость, я получаю ошибки, потому что я не предоставляю поставщиков для зависимостей внедренной мной службы. Если я имитирую службу с помощью объекта, я получаю сообщение об отсутствии ожидаемой функции.

Почему тестировщик ищет функцию, которую я не тестирую? Как правильно с этим справиться?

Вот мой файл spe c. Взгляните на FirebaseService:

import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ViewContainerRef } from '@angular/core';
import { CreatorStudioComponent } from './creator-studio.component';
import { DesignService } from 'app/main/services/design-service.service';
import { AuthService } from 'app/main/services/auth.service';
import { FirebaseService } from 'app/main/services/firebase.service';
import { AngularFireStorage } from '@angular/fire/storage';
import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { editParameterDialog } from './parameter-dialog/parameter-dialog.component';
import { SubmenuDialog } from './submenu-dialog/submenu-dialog.component';
import { MatSelectModule } from '@angular/material/select';
import { MatSnackBar } from '@angular/material/snack-bar';


describe('CreatorStudioComponent', () => {

    let component: CreatorStudioComponent;
    let fixture: ComponentFixture<CreatorStudioComponent>;

    let DesignServiceStub : DesignService;
    let AuthServiceStub : AuthService;
    let FirebaseServiceStub :FirebaseService;
    let SnackBarStub : MatSnackBar;
    let AngularFireStub : AngularFireStorage;
    let vCRefStub :  ViewContainerRef;
    const mockDialogRef = {
        close: jasmine.createSpy('close'),
        open: jasmine.createSpy('open')
    };
    let mockDialog = {
        close: jasmine.createSpy('close'),
        open: jasmine.createSpy('open'),
        Overlay : jasmine.createSpy('Overlay')
    }
    let mockSnackBar = {
        Overlay : jasmine.createSpy('Overlay')
    }

    beforeEach(async(() => {
        TestBed.configureTestingModule({
            declarations: [ CreatorStudioComponent ]
        })
        .compileComponents();
    }));



    beforeEach(() => {

        TestBed.configureTestingModule({
            declarations: [ CreatorStudioComponent ],
            providers: [ { provide: DesignService },
                         { provide: MatDialog, useValue : mockDialog },
                         { provide: MatDialogRef, useValue : mockDialogRef },
                         { provide: AuthService, useValue : {} },
                         { provide: FirebaseService, FirebaseServiceStub },
                         { provide: MatSnackBar, useValue : mockSnackBar },
                         { provide: AngularFireStorage, useValue : {} },
                         { provide: ViewContainerRef } ]
        });

        fixture = TestBed.createComponent(CreatorStudioComponent);
        component = fixture.componentInstance;
        fixture.detectChanges();
    });

    it('should create', () => {
        expect(component).toBeTruthy();
    });
});

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

NullInjectorError: R3InjectorError(DynamicTestModule)[FirebaseService -> AngularFirestore -> InjectionToken angularfire2.app.options -> InjectionToken angularfire2.app.options]: 

NullInjectorError: Нет поставщика для InjectionToken angularfire2.app.options!

Однако изменение его на следующее:

{ provide: FirebaseService, useValue : {} },

Вызывает ошибку из-за того, что у службы нет необходимой функции.

...