Вам нужно Макет вашего AuthService , так как это компонентный тест.
Вы можете сделать это, указав объект в коде инициализации модуля
TestBed.configureTestingModule({
declarations: [ HeaderComponent, DialogListConfigurationComponent, DialogConfirmNewConfigurationComponent ],
providers: [
MessageService,
JwtHelperService,
{provide: AuthService, useClass: AuthServiceMock} ],
imports: [ DialogModule, MenubarModule, FontAwesomeModule, RouterTestingModule, TreeModule, HttpClientTestingModule, JwtModule.forRoot({
config: {
tokenGetter: () => {
return sessionStorage.getItem(environment.tokenName);
},
//Exclude this URL from JWT (doesn't add the authentication header)
blacklistedRoutes: [
'/api/login',
]
}
}), ]
})
.compileComponents();
класс AuthServiceMock
должен реализовывать тот же интерфейс, что и исходный. это может быть что-то вроде этого:
export class AuthServiceMock {
// ...
decodeToken: {
username: 'testUser'
};
}
чем, перед созданием компонента настройте класс макета, если вы не хотите устанавливать по умолчанию внутри макета.
ПРИМЕЧАНИЕ: вы можете сделать этот последний шаг, не создавая насмешки, но это нарушит разделение проблем в ваших тестах.
beforeEach(() => {
let authServiceMock: AuthServiceMock = TestBed.get(AuthService);
authServiceMock.decodeToken = { username: 'anotheruser' };
fixture = TestBed.createComponent(HeaderComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
Это должно позволить HeaderComponent
запустить строку this.authService.decodedToken.username
.
В качестве руководства: необходимо смоделировать зависимости, которые зависят от внешних данных.
Вы также можете удалить зависимости исходного AuthService
, если ранее вы включили их в инициализацию тестового модуля. Например, если JwtHelperService
используется только для AuthService
, тестовый модуль может исключить этого поставщика.