2017-07-14 11 views
0

私は失敗しているunitestに詰まっているが、私はなぜ抑止力がない。角度2モックhttpポストunittestが失敗

私はテストしたいサービスがあります。 API urlへの簡単なサービス投稿。ここで

は、サービス

import { Injectable } from '@angular/core'; 
import { Http, Response, RequestOptions, Headers } from '@angular/http'; 
import { Observable } from 'rxjs/Observable'; 
import { environment } from '../../../environments/environment'; 
import 'rxjs/add/operator/map'; 

import { ICarrierDetails } from './carrier-details'; 

@Injectable() 
export class CarrierService { 

    apiGatewayCartUri = environment.cartApiUri; 

    constructor(private http: Http) { } 

    getCarriersDetails(): Observable<ICarrierDetails[]> { 
    return this.http.post(this.apiGatewayCartUri + 'carriers/', {}) 
     .map((response: Response) => <ICarrierDetails[]>response.json()); 
    } 

} 

のためのコードであり、ここで私のスペックファイルです:

import { CarrierService } from './carrier.service' 
import { Observable } from 'rxjs/Observable'; 
import { environment } from '../../../environments/environment'; 
import 'rxjs/add/observable/of'; 

describe('CarrierService',() => { 
    let carrierService: CarrierService; 
    let mockHttp; 
    let apiGatewayCartUri; 


    beforeEach(() => { 
     apiGatewayCartUri = environment.cartApiUri; 
     mockHttp = jasmine.createSpyObj('mockHttp', ['post']) 
     carrierService = new CarrierService(mockHttp)  
    }); 

    describe('Should call http.post method with the right URL',() => {   
     mockHttp.post.and.returnValue(Observable.of(false)); 
     carrierService.getCarriersDetails(); 
     expect(mockHttp.post).toHaveBeenCalledWith(apiGatewayCartUri + 'carriers/', {}); 
    }); 
}); 

そして、これは私がコンソールにすべての時間を取得する例外です:

クローム59.0.3071 (Mac OS X 10.12.5)CarrierService適切なURLでhttp.postメソッドを呼び出すと、宣言例外が発生するFAILED TypeError:undefのプロパティ 'post'を読み取ることができませんスイート内に を入れてください。 (http://localhost:9883/_karma_webpack_/main.bundle.js:97:17) at ZoneDelegate.webpackJsonp .../../../../zone.js/dist/zone.js.ZoneDelegate.invoke(http://localhost:9883/_karma_webpack_/polyfills.bundle.js:10672:26) at Zone.webpackJsonp .../.. /。 ./../zone.js/dist/zone.js.Zone.run(http://localhost:9883/_karma_webpack_/polyfills.bundle.js:10464:43) (スイート) (http://localhost:9883/_karma_webpack_/vendor.bundle.js:2195:29)Env.jasmineEnv。での (匿名関数)[0120] [as describe](http://localhost:9883/_karma_webpack_/vendor.bundle.js:2172:38) (スイート) (http://localhost:9883/_karma_webpack_/main.bundle.js:96:5) でZoneDelegate.webpackJsonp .../../../../zone.js/dist/zone.js.ZoneDelegate.invoke(http://localhost:9883/_karma_webpack_/polyfills.bundle.js:10672:26) でZone.webpackJsonp .../.. /。 ./../zone.js/dist/zone.js.Zone.run(http://localhost:9883/_karma_webpack_/polyfills.bundle.js:10464:43) (スイート) (http://localhost:9883/_karma_webpack_/vendor.bundle.js:2195:29

+0

私はこの部分が間違っていると思う 'carrierService =新しいCarrierServiceは(mockHttp)'、あなたはユニットテストではそのようなサービスを使用することはできません。テスト中のサービスについての詳しい説明http://chariotsolutions.com/blog/post/testing-angular-2-0-x-services-http-jasmine-karma/ – onetwo12

答えて

0

あなたの問題はbeforeEachメソッドにあると思います。それは非同期関数でなければなりません。

てみはこのようにそれを使用する:

import { async } from '@angular/core/testing'; 

beforeEach(async(() => { 
    apiGatewayCartUri = environment.cartApiUri; 
    mockHttp = jasmine.createSpyObj('mockHttp', ['post']); 
    carrierService = new CarrierService(mockHttp); 
})); 
+0

"コンパイルエラーが発生しました"名前を '非同期'で見つけることができません。 "私も変数の非同期を宣言しようとしました "let async;しかし、その後、私は "TypeError:asyncは関数ではありません"を取得します。 – Eldlabs

+0

@Eldlabsは更新を参照してください。 – onetwo12

+0

問題が発生しました: Chrome 59.0.3071(Mac OS X 10.12.5)CarrierService適切なURLのhttp.postメソッドを呼び出すと、宣言例外が発生しました。FAILED \t TypeError: 'post'というプロパティを読み取れません定義されていません \tスイート。 (http:// localhost:9884/_karma_webpack_/main.bundle.js:101:17)... – Eldlabs

関連する問題