2016-10-17 37 views
4

我有一个规范的代码来测试像这样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

为什么会发生这种错误?

回答

12

您需要使用subscribe方法返回某些内容,因为组件直接从login调用subscribe。一个字符串没有。你可以只返回一个对象与subscribe功能,它应该工作

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

或者,如果你想传递一个真实的观察到的,你可以

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

您可能需要进口rxjs/add/observable/of

+0

适合我!谢谢 –

+0

对于第一种选择,是否有任何方法返回值?像这样的例子:and.returnValue({subscribe:()=> {count:1000}}); – abyrne85

1

您需要模拟登录功能,如下所示:

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

,你可能会发现observable.if功能不确定,所以你需要导入观察到的是这样的:

import { Observable } from 'rxjs/Rx'; 
import 'rxjs/add/observable/of'; 
0

更改为间谍的“登录”的方法对你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();