2016-12-28 6 views
0

javascriptファイルにメソッドがあります。ジャスミン:ジャスミンを使用して別の関数から呼び出される関数をテストする

function foo() { 
    setTimeout(function() { 
     bar.getSomeUrl(); 
     },WAIT_FOR_SOMETIME); 
} 

ここで、getSomeUrl()は以下のように実装されています。

var bar = { 
    getSomeUrl : function(){ 
     window.location.href = 'someUrl'; 
     return; 
    }, 
    anotherProp : function() { 
     return bar.getSomeUrl(); 
    } 
}; 

私はfoo()メソッドを呼び出したときgetSomeUrl()メソッドが呼び出されることをテストしようとしています。

私は試験にジャスミンを使用しています。私のジャスミンテストは以下の通りです:

describe('This tests getSomeUrl()', function() { 
    it('is called when foo() is called', function(){ 
     spyOn(bar,'getSomeUrl').and.callFake(function(){}); 

     window.foo(); 
     expect(bar.getSomeUrl).toHaveBeenCalled(); 

    }); 
}); 

私はそのための別のテストを持っているので、私は本当にgetSomeUrl()内部で起こっていただきましテストを気にしないでください。

私がテストしようとしているのは、私がfoo()をどこかから呼び出すときに、getSomeUrl()が呼び出されることです。

  1. 私はこの方法を行う場合、テストは失敗し、すべてのテストを実行しているの終わりに、ブラウザがsomeUrlにリダイレクト:

    は、私は次のような問題があります。私はbar.getSomeUrl()のスパイを持っていたので、window.foo()と呼んだときにfake methodを返していたので、実際にはbar.getSomeUrl()を呼ぶことはなかったので、私はこれが起こるとは思わなかった。

  2. は、だから私は、私は以下のようにそれを行う必要があるかもしれ考えた:

    )((window.foo)は.toHaveBeenCalled期待します。

私はbar.getSomeUrl()が呼び出されていることをテストしようとしていますので、これは、意味がありません。私はこれをしたとき

はしかし、テストが失敗し、私は以下のエラーが表示されます。

Error: Expected a spy, but got Function.

私もそれが問題を引き起こしているsetTimeout関数であると考えていたとするfoo()機能を変更:

function foo() { 
    bar.getSomeUrl(); 
}; 

は、私はジャスミンと協力してきたもの

を変更しませんでしたeとJavascriptは数日間しか使用できず、物事の仕組みを幅広く理解しています。

このテストに合格するための提案や、私が間違っていることに関するポインタも大変ありがたいです。まず

+0

Java関連ではありません。 Javascriptは1つの単語で綴られており、Javaとの関係はありません。 –

+0

それに気をつけました。ありがとう。 – ChillBan123

+0

構文エラーがあります。 'bar.getSomeUrl'はオブジェクトリテラルです(構文が無効です)。それは機能ではありません – Phil

答えて

0

bar.getSomeUrlは、機能しない(無効)オブジェクト

var bar = { 
    getSomeUrl : function() { 
     window.location.href = 'someUrl'; 
     return; 
    }, 
    anotherProp : function() { 
     return bar.getSomeUrl(); 
    } 
}; 

秒でタイムアウトとコードをテストする場合Jasmine Clock使用すべきです。

describe('This tests getSomeUrl()', function() { 
    beforeEach(function() { 
     jasmine.clock().install(); 
    }); 

    afterEach(function() { 
     jasmine.clock().uninstall(); 
    }); 

    it('is called when foo() is called', function(){ 
     spyOn(bar,'getSomeUrl').and.callFake(function(){}); 

     foo(); 
     expect(bar.getSomeUrl).not.toHaveBeenCalled(); 

     jasmine.clock().tick(WAIT_FOR_SOMETIME);  
     expect(bar.getSomeUrl).toHaveBeenCalled();  
    }); 
}); 
+0

ありがとうございます。私は 'bar.getSomeUrl'を関数として実装しました。それは質問を掲示している間にタイプミスでした。 – ChillBan123

+0

提案を試してみました。助けにならない。それでも 'someUrl'にリダイレクトされました。 – ChillBan123

+0

OK、ブラウザでテストランナーをデバッグしましたが、例外が発生していました。 'モッククロックがインストールされていません。 ' プロジェクトの再構築をやり直してみました。ありがとう@Phil。だから、setTimeout関数呼び出しのためにテストが失敗しましたか? – ChillBan123

関連する問題