Меня очень смущает то, как модульное тестирование компонента в 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 : {} },
Вызывает ошибку из-за того, что у службы нет необходимой функции.