2016-10-17 64 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();