angular2使用茉莉的订阅方法
问题描述:
我有一个规范的代码来测试像这样angular2使用茉莉的订阅方法
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();
});
和实现这样的代码
login() {
this.auth.login(this.username, this.password).subscribe(() => {
}
});
}
提示错误测试:
this.auth.login(...).subscribe is not a function
为什么会发生这种错误?
答
您需要使用subscribe
方法返回某些内容,因为组件直接从login
调用subscribe
。一个字符串没有。你可以只返回一个对象与subscribe
功能,它应该工作
and.returnValue({ subscribe:() => {} });
或者,如果你想传递一个真实的观察到的,你可以
and.returnValue(Observable.of('some value'));
您可能需要进口rxjs/add/observable/of
答
您需要模拟登录功能,如下所示:
let loginService: any = {
login(): Observable<any> {
return Observable.of('you object');
}
};
,你可能会发现observable.if功能不确定,所以你需要导入观察到的是这样的:
import { Observable } from 'rxjs/Rx';
import 'rxjs/add/observable/of';
答
更改为间谍的“登录”的方法对你authService返回而不是值可观察到的。你需要进口:
import 'rxjs/add/observable/from';
import {Observable} from 'rxjs/Observable';
设置你的间谍:
const loginResult = '';
const spy = spyOn(authService, 'login').and.callFake(() => {
return Observable.from([loginResult]);
})
呼叫登录:
fixture.componentInstance.login();
断言:
expect(spy).toHaveBeenCalled();
适合我!谢谢 –
对于第一种选择,是否有任何方法返回值?像这样的例子:and.returnValue({subscribe:()=> {count:1000}}); – abyrne85