Угловое тестирование макета подписанного свойства
У меня есть сервис с 2 свойствами:
обслуживание
...
public usernameAnnounced;
private username: Subject<string> = new Subject<string>();
constructor() {
super();
this.usernameAnnounced = this.username.asObservable();
}
На моем компоненте я хочу подписаться на собственность:
Составная часть
public ngOnInit(): void {
this.service.usernameAnnounced.subscribe((username: string) => {
this.username = NavbarComponent.capitalizeFirstLetter(username);
});
}
Я выбрасываю имя пользователя на другой комп. но это не имеет отношения к этому вопросу. Теперь я хочу издеваться над именем пользователя Анонсировано, но у меня есть трудности с ним. Я попробовал это с spyOn
и он бросает мне: "usernameAnnounded не является функцией". с spyOnProperties
это бросает мне: "собственность не добытчик".
Протестированный комп.
пока что мой подход выглядит следующим образом:
beforeEach(async(() => {
TestBed.configureTestingModule({
...
declarations: [NavbarComponent],
providers: [
...,
{provide: service, useValue: authenticationMock}
]
})
.compileComponents();
fixture = TestBed.createComponent(NavbarComponent);
}));
...
it('should render username',() => {
const underTest = fixture.componentInstance;
spyOnProperty(authenticationMock, 'usernameAnnounced').and.returnValue({
subscribe: () => {'boboUser'}}); <== important part here
underTest.ngOnInit();
fixture.detectChanges();
const compiled: HTMLElement = fixture.debugElement.nativeElement.querySelector('#userName');
const rendered: string = compiled.textContent;
expect(rendered).toMatch(`Logged in as: ${underTest.username}`);
});
У кого-нибудь есть намеки?
2 ответа
Я нашел решение с помощью: Прежде всего, создав jasmine.spyObj следующим образом:
const authenticationMock: AuthenticationService = jasmine.createSpyObj('AuthenticationService',
['usernameAnnounced']);
Присвойте это проверенному сервису: {provide: AuthenticationService, useValue: authenticationMock}
, И сам модульный тест просто назначает свойство с ожидаемым результатом:
const spy = TestBed.get(AuthenticationService);
spy.usernameAnnounced = Observable.of('dummyUser');
Мне всегда приходилось строить тему (или поведение) на моем макете.
class authenticationMock{ // is the mock of AuthenticationService
public usernameAnnounced:Subject<string> = new Subject<string>();
}
...
// in Test
let authenticationService = TestBed.get(AuthenticationService)
...
authenticationService.next('myNewUser');
теплые пожелания