Czesc. Z racji tego ze jestem raczej slabiutki ze wszystkim co zwiazane z JS prosilbym o wyjasnienie kilku rzeczy zwiazanych z testowaniem w angularze.

Powiedzmy ze mamy taki kod:

export function isEmailUnique(api: SignUpApi): AsyncValidatorFn {
  return (control: AbstractControl) =>
    timer(1500).pipe(switchMap(() => {
      return api.isEmailUnique(control.value)
        .pipe(
          map(response => {
            return response === true ? { emailNotUnique: true } : null;
          }))
    }))
}

No i chialbym sobie go grzecznie przetestowac. Wiec zaczalem od takich wygibasow.

describe('email uniqueness validator', () => {
  let api: SignUpApi;
  let form: FormGroup;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [HttpClientModule],
      providers: [SignUpApi]
    })

    api = TestBed.get(SignUpApi);

    form = new FormGroup({
      test: new FormControl(undefined, [], [isEmailUnique(api)])
    });
  });

  it('should set an error on form of type emailNotUnique', (done) => {

    spyOn(api, 'isEmailUnique').and.returnValue(of(true));

    form.get('test').setValue('email');

    form.updateValueAndValidity();

    ///tutaj zaczynaja sie wygibasy..
    timer(5000)
      .subscribe(() => {
        if (form.status !== 'PENDING') {
          expect(form.get('test').hasError('emailNotUnique')).toBeTruthy();
          done();
        }
      })
  })
})

No i widze ze formularz ma status pending wiec w normalnym ukladzie mam swiadomosc ze czeka na odpowiedz z backendu tylko ze tutaj nie mam backendu wiec stwierdzilem ze dodam sobie "spaja" i zmockuje sobie odpowiedz. No wlasnie tylko cos nie dziala. Prawdopdobnie brakuje mi jakis podstaw i sam test powinien wygladac zgola inaczej a google cos slabo mi podpowiada. Spojrzy ktos na to w wolnej chwili ?