2016-06-21 2 views
1

私はAngular2/Ionic2 Appで作業しています。私はややこのようになります方法をテストしようとしています:ジャスミン:宣言された変数を含むメソッドをテストする方法

goToFoo(id : number) { 

    let result = this.someService.initialize(); 
    if (result.hasError == false) { 
    switch (result.startPage) { 

    case START_PAGES.OTHER_PAGE: 

     this._nav.setRoot(OtherPage); 
     break; 

    case START_PAGES.FOO: 

     this._nav.setRoot(FooPage); 
     break; 

    default: 
     return false; 
    } 
    } 
} 

私はこのエラーを取得し、文の「場合」を指している:TypeError: 'undefined' is not an object (evaluating 'result.hasError')

ここでは、私が試したものです:

const mockResult = { 
    hasError(){} 
} 

it("should open foo page", inject((omitted)) => { 
    spyOn(mockResult, "hasError"); 
    const mockId = 123; 
    const fooCall = Page.goToFoo(mockId); 

    expect(mockResult.hasError).toHaveBeenCalled(); 
    expect(fooCall).toEqual(this._nav.setRoot(FooPage)); 
})); 

変数を初期化して使用するメソッドをテストするより良い方法があると思われます。私はmockResultを 'result'に正しく接続していません。何か案は?

答えて

1

関数/メソッドをテストするときには、一部の入力(パラメータ)が期待される出力(戻り値)になることだけをテストできます。これらの関数/メソッドの内部状態はテストできません。この関数の実行が関数外にある副作用をテストすることができます。たとえば、変数をthis.state = this.someService.initalize()に割り当てると、関数が完了した後にthis.stateに値があるかどうかをテストできます。

+0

私は本当に内部状態をテストするつもりはありませんが、テストエラーは私が何か他のものをテストするのを妨げています。 'result = this.someService.initialize();'の 'result 'はテストコードでは認識できません。それは定義されていません。 – jhhoff02

+0

次に動作させるためにいくつかの模擬' SomeService'を提供する必要があります。さもなければ、あなたはそれをテストすることができません。 –

+0

それは提供されていますが、それ以降は何をするべきかわかりません。私は 'const testResult = SomeService.initialize();のようなものを考えていました。 expect(testResult).toHaveBeenCalled(); 'これはまだ結果が未定義のためエラーには影響しません – jhhoff02

関連する問題