I have a spec code to test like this
it(\'login test\', () => {
const fixture = TestBed.createComponent(component);
fixture.detectChanges();
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';
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();
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';
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