Сервис углового юнит-тестирования spyOn из компонента - PullRequest
0 голосов
/ 26 ноября 2018

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

I 'мы пробовали

beforeEach(() => {
...
authService = TestBed.get(AuthService);
});

И это не работает

it('should pass proper values', () => {
    const submitSpy = spyOn(authService, 'signInByLogin');
    const loginSpy = spyOn(component, 'signIn').and.callThrough();

    const username = fixture.debugElement.query(By.css('#username'));
    const password = fixture.debugElement.query(By.css('#password'));
    const submitBtn = fixture.debugElement.query(By.css('[type="submit"]'));

    username.nativeElement.value = 'test';
    password.nativeElement.value = 'password';

    fixture.detectChanges();

    expect(username.nativeElement.value).toBe('test');
    expect(password.nativeElement.value).toBe('password');
    expect(submitBtn).toBeTruthy();

    fixture.detectChanges();

    submitBtn.triggerEventHandler('click', null);

    fixture.whenStable().then(() => {
        expect(loginSpy).toHaveBeenCalled();
        expect(submitSpy).toHaveBeenCalledWith('test', 'password');
    });
});

В нем говорится

Ошибка была вызвана после того, как все ожидаемый шпион signInByLogin был вызван с['test', 'password'], но фактические вызовы были ['', ''].

Метод службы вызывается из закрытой функции компонента входа в систему.И звонок

this.authService
            .signInByLogin(this.form.controls['login'].value, this.form.controls['password'].value).subscribe(...)

1 Ответ

0 голосов
/ 26 ноября 2018

Шпионаж работает отлично.Как видно из сообщения об ошибке, сервис вызывается, но он вызывается с пустыми строками вместо значений полей ввода.

Вы изменяете значение входов, но никогда не генерируете никаких событийТаким образом, Angular не знает, что значение изменилось, и это должно изменить его модель.Вам нужно добавить что-то вроде

username.nativeElement.dispatchEvent(new Event("imput));

(то же самое для другого входа, конечно).

Бесстыдный плагин: в этом не будет необходимости, и код теста будет болеечитаемый, если вы использовали ngx-speculoos .

...