angular2 testing using jasmine for subscribe method

前端 未结 4 1493
慢半拍i
慢半拍i 2020-12-29 05:21

I have a spec code to test like this

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

      const fixture = TestBed.createComponent(component);
      fixture.detectChanges();         


        
相关标签:
4条回答
  • 2020-12-29 05:56

    On rxjs v6 you should use of instead of Observable.of or Observable.from e.g

    const loginService: any = {
        getUser: () => of(['Adam West']),
    };
    

    and import

    import { of } from 'rxjs';
    
    0 讨论(0)
  • 2020-12-29 05:57

    Change your spy for the 'login' method on your authService to return an observable instead of a value. You'll need to import:

    import 'rxjs/add/observable/from';
    import {Observable} from 'rxjs/Observable';
    

    Setup your spy:

    const loginResult = '';
    const spy = spyOn(authService, 'login').and.callFake(() => {
        return Observable.from([loginResult]);
    })
    

    Call login:

    fixture.componentInstance.login();
    

    Assert:

    expect(spy).toHaveBeenCalled();
    
    0 讨论(0)
  • 2020-12-29 06:07

    You need to mock the login function as follows:

    let loginService: any = {
        login(): Observable<any> {
            return Observable.of('you object');
        }
    };
    

    you might find the observable.if function undefined, so you need to import the observable this way:

    import { Observable } from 'rxjs/Rx';
    import 'rxjs/add/observable/of';
    
    0 讨论(0)
  • 2020-12-29 06:11

    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

    0 讨论(0)
提交回复
热议问题