Угловое тестирование макета подписанного свойства - PullRequest
0 голосов
/ 05 июля 2018

У меня есть сервис с 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 ]

0 голосов
/ 05 июля 2018

Я нашел решение с помощью: Прежде всего, создайте jasmine.spyObj так:

    const authenticationMock: AuthenticationService = jasmine.createSpyObj('AuthenticationService',
    ['usernameAnnounced']);

Присвойте его поддельной службе: {provide: AuthenticationService, useValue: authenticationMock}. А самому модульному тесту просто присваиваем свойство с ожидаемым результатом:

const spy = TestBed.get(AuthenticationService);
    spy.usernameAnnounced = Observable.of('dummyUser');
0 голосов
/ 05 июля 2018

Мне всегда приходилось строить Предмет (или ПоведениеСубъект) на моем макете.

class authenticationMock{ // is the mock of AuthenticationService
    public usernameAnnounced:Subject<string> = new Subject<string>();
}

...

// in Test
let authenticationService = TestBed.get(AuthenticationService)
...
authenticationService.next('myNewUser');

С уважением

...