angular2 testing using jasmine for subscribe method

kohli picture kohli · Oct 17, 2016 · Viewed 46.2k times · Source

I have a spec code to test like this

 it('login test', () => {

      const fixture = TestBed.createComponent(component);
      fixture.detectChanges();
      let authService = fixture.debugElement.injector.get(Auth);
      spyOn(authService, 'login').and.returnValue('');

      const elements = fixture.nativeElement;
      fixture.componentInstance.login();
      expect(authService.login).toHaveBeenCalled();
    });

and the implementation code like this

login() {

    this.auth.login(this.username, this.password).subscribe(() => {

      }
    });
  }

it gives error:

this.auth.login(...).subscribe is not a function

Why does this error happen?

Answer

Paul Samsotha picture Paul Samsotha · Oct 17, 2016

You need to return something with a subscribe method, as the component calls subscribe directly from login. A string does not. You could just return an object with a subscribe function and it should work

and.returnValue({ subscribe: () => {} });

Or if you want to pass a real observable, you could

and.returnValue(Observable.of('some value'));

You might need to import rxjs/add/observable/of