2017-02-08 6 views
2

これまでOKだったAngular 2アプリケーションがあります。私のGlobalsService.getGlobals()は、私のOptionService.getOptions()を通じて "USA States"を取得します。私のコードがカルマ/ジャスミンテストに落ちるところです。Angular2カルマテストでは「TypeError:this._subscribeは関数ではありません」と書かれています

現在のテスト設定でgetGlobals()を呼び出すと、「this._subscribeは関数ではありません」というエラーが表示されます。私はGoogle Chromeが協力していないので、これをデバッグするのは難しいと思っています。

デバッグを追加したgetGlobals()コードが追加されました。私はgetOptions()と.subscribe()の間でコードを分割して、何が起こっているのかを確認します。

public getGlobals(): void { 
    let asdf = this.optionService.getOptions(); 

    console.log("asdf is " + (typeof asdf) + ", asdf.subscribe is: " + asdf.subscribe); 
    try { 
    asdf.subscribe(
     (options: Option[]) => this.fillOptions(options), 
     (error: string) => this.error = error 
    ); 
    } catch(error) { 
    console.log("caught error involving asdf, it is: " + error); 
    throw error; 
    } 
} 

私は私が手にこのコードを実行します。

LOG: 'asdf is object, asdf.subscribe is: function (observerOrNext, error, complete) { 
[1]   var operator = this.operator; 
[1]   var sink = toSubscriber_1.toSubscriber(observerOrNext, error, complete); 
[1]   if (operator) { 
[1]    operator.call(sink, this.source); 
[1]   } 
[1]   else { 
[1]    sink.add(this._subscribe(sink)); 
[1]   } 
[1]   if (sink.syncErrorThrowable) { 
[1]    sink.syncErrorThrowable = false; 
[1]    if (sink.syncErrorThrown) { 
[1]     throw sink.syncErrorValue; 
[1]    } 
[1]   } 
[1]   return sink; 
[1]  }' 

asdf.subscribeのコードは、あなたがnode_modules/rxjs/Observable.jsから見たものです。したがって、getOptions()からの戻り値はObservableです。多くのプロパティの中には、次のような特徴があります。

_subscribe: Array[4] (each item is an Object of my Option data type) 
_proto_: Object 
    _subscribe: (subscriber) 
    subscribe: (observer or next, error, complete) 

しかし、コードを続けるとエラーが発生します。変数asdfのある場所では、 "this"はGlobalsServiceです。

マイモックOptionServiceコード:

@Injectable() 
export class MockOptionService { 
    constructor() { } 

    getOptions(): Observable<Option[]> { 
    let options: Option[] = [ 
     { id: 'IN', name: 'Indiana', topic: Option.TOPIC_STATE }, 
     { id: 'NJ', name: 'New Jersey', topic: Option.TOPIC_STATE }, 
     { id: 'CONCERT', name: "Concert", topic: Option.TOPIC_EVENT_TYPE }, 
     { id: 'NY', name: 'New York', topic: Option.TOPIC_STATE } 
    ]; 
    return Observable.create(options); 
    } 

} 

これを介して注入される:

describe('Globals Service',() => { 

    beforeEach(() => { 

    TestBed.configureTestingModule({ 
     providers: [ 
     { provide: OptionService, useClass: MockOptionService }, 
     { provide: GlobalsService, useClass: GlobalsService } 
     ] 
    }); 
[SNIP] 

})。

私が言ったように、私はこれをデバッグするときにChromeに問題があります。デバッガでObservable.jsソースを表示し、ブレークポイントを設定しようとすると、ブラウザに存在しないObservable.tsファイルの空白ページが表示されます。ブレークポイントはどちらの場所にも表示されません。コードは、存在しないObservable.ts:92で停止しています。

私の質問は、その後、以下のとおりです。

1.私は私の活字の世界でJavascriptのブレークポイントを与えるためにChromeを説得することはできますか?

2.オブジェクト配列を作成してObservableにアタッチするための適切な機能は何ですか? Observable.create()が間違っていると思われます。

ありがとう、 Jerome。

答えて

5

代わりにObservable.ofを使用してください。 Observable.createは、サブスクライブ機能が必要です。 Observable.createは、 "カスタムロジック" Observableを作成するためのもので、Observable.ofは、渡した値を出力する基本Observableを作成するだけです。

+0

私はそれを試み、結果を得ました。私はまだクロームの反社会的行動については不思議です。 –

関連する問題