2012-03-22 6 views
2

私のプロジェクトのテストカバレッジを向上させるために、既存のJSコードのテストを構築し始めています。mavenでテストを実行中にjasmineのjQuery(window).height()にアクセスできません

既存のモジュールの1つは、ウィンドウの高さを変数jQueryで置きます。 var window_height = jQuery(window).height(); 内部的にjQueryはclientHeightプロパティを使用します。 MVNクリーンまたはMVN -oテストが、私はエラーを取得していますインストールのいずれかで今

:ヌルから は、プロパティを読み取ることができません「clientHeight」

私は、これが原因で、「仮想ブラウザであると仮定ジャスミンが作成するウィンドウプロパティはありません。この仕事をする方法はありますか?

+0

btw、私は** mvn jasmine:bdd **を実行し、ブラウザ(localhost:8234)でテスト結果を確認しても問題はありません... – publicJorn

+0

'前の'メソッドを呼び出し、clientHeightプロパティを設定しますか? –

答えて

0

回答ありがとうございました。jQuery.heightを上書きするというアイデアは、スパイではなくトリックでした。

(function(){ 
    $.prototype.height = function() { 
    var original = $.prototype.height; 

    if (this[0] === window) { 
     return 800; // Return mock window height 
    } else { 
     return original.apply(this, arguments); 
    } 
    } 
})(); 

pom.xmlには、このファイルがjQueryの後に直接組み込まれています。

+0

これは機能しますが、Derekの提案ははるかに良いアプローチです。スパイ/スタブは、テストコードをプロダクションコードに追加する必要がないように明示的に存在します。多くの理由で悪い習慣... – glortho

8

jQueryのメソッドをオーバーライドすることの安全性を保証することはできませんが、jasmineのspyOn関数を使用して$(window).height()が返す関数をオーバーライドする方法は次のとおりです。

it("can override jquerys height function", function() { 
    var original = $.prototype.height; 
    spyOn($.prototype, 'height').andCallFake(function() { 
    if (this[0] === window) { 
     return 5; // whatever you want the window height to appear to be 
    } else { 
     return original.apply(this, arguments); 
    } 
    }); 

    // window height gets overridden 
    expect($(window).height()).toEqual(5); 

    // everything else uses the actual jQuery call 
    expect($("body").height()).toBeGreaterThan(5); 
}); 

また、どこかとばかりspyOnその偽物を使用して独自のgetWindowHeight()関数を作成し、より安全になります。

+1

あなたの答えをありがとう、問題は仕様の実行の前に始まります。 問題は、initがウィンドウの高さを取得するソーススクリプトの1つで発生します。 あなたの提案は、jQuery.heightプロパティを上書きすることで答えを使うことができましたが、スパイではなくグローバルスコープで答えています。提案をUpvote! – publicJorn

+0

あなたの答えは@Derekありがとうございます。 – Max

関連する問題