7

私は次の機能を持っています

var redirect = function() {
    window.location.href = "http://www.google.com";
}

qUnitを使用してこの機能をテストしたい。

問題は、テストを実行する HTML ドキュメントを呼び出すと、 を呼び出すテストに到達するとすぐにredirect()、ブラウザーが google.com をロードすることです。私がやりたいのは、何らかの方法で window.location.href をモックアウトして、リダイレクトしないようにすることです。これにより、適切な値に設定されていることを確認できます。

これをよりテストしやすい方法で書き直すことは、受け入れられる答えであり、歓迎されます。私はqUnitを使用しているので、昔ながらのリファクタリングと同様に、いくつかのjQueryマジックが適切です。window.location.href のカスタム セッターを追加することが提案されましたが、これを機能させる方法がわかりませんでした。

私のコードの動作を変更する提案はありません。

4

3 に答える 3

3

これが私がそれを解決した方法です。元の質問にgiggity.navOnChange類似した機能です。redirect

コード:

var giggity = giggity || {};

$(document).ready(function() {
    $("#branches").change(giggity.navOnChange);
    $("#tags").change(giggity.navOnChange);
});

giggity.window = window;

giggity.navOnChange = function() {
    giggity.window.location.href = this.value;
};

テストコード:

var giggity = giggity || {};

test("giggity.navOnChange", function() {
    var temp = giggity.window
    giggity.window = { location: {} };
    var mockSelect = {
        value: "/link/to/some/branch",
        onChange: giggity.navOnChange
    }
    mockSelect.onChange();
    equal(giggity.window.location.href, mockSelect.value);
    giggity.window = temp; // restore mocked variable
});

giggityオブジェクトをコードの名前空間として使用しています。giggity.windowを指すように変数を割り当て、を介してwindow対話します。このようにして、オブジェクトの操作を簡単に模倣できます。モック オブジェクトを指定し、変更する関数を呼び出して、モックの値を確認します。windowgiggity.windowwindowgiggity.windowgiggity.window

于 2011-10-20T09:04:31.123 に答える
2

ページをリロードせずに window.location.href を変更することはできません。ただし、これらの種類の関数をどうしてもテストしたい場合は、ロジックを少し変更する必要があります。

例 #1:

これは 2 つの関数で行うことができます。1 つは自分の関数に似た単純な redirectTo 関数で、もう 1 つはビルドと URL のロジックを持つ関数です。このような:

// this function is so simple that you never need to unit test it
var redirectTo = function(url)
{
    window.location.href = url;
}

// if this function has any logic worth testing you can do that without redirects
var buildUrl = function(someParameters)
{
    // ....
    // here be some logic...
    // ....

    return "http://www.google.com";
}
  1. redirectTo(url) 関数は非常にシンプルなので、テストしなくても機能することが常にわかります。
  2. buildUrl(someParameters) 関数には、URL を構築するためのロジックを含めることができるため、これをテストする必要があります。ページをリダイレクトせずにこれをテストできます。

例 #2:

これら 2 つのクロスを書くこともできます。

// don't test this function as it will redirect
var redirect = function()
{
    window.location.href = buildUrl();
}

// if this function has any logic worth testing you can do that without redirects
var buildUrl = function()
{
    // ....
    // here be some logic...
    // ....

    return "http://www.google.com";
}

上記の例は、元の関数と同様の形式ですが、実際にテストできる URL 構築ロジック関数を持っています。

例ではありませんが、#3:

一方、ロジックを変更したくなく、このように単純な関数がある場合は、テストしなくても大したことではありません...

于 2011-10-20T06:10:10.473 に答える
1

あなたがしようとしていることは、単体テストレベルではなく、統合または受け入れテストレベルで行うのが最善です。そうしないと、偽のブラウザーになってしまい、現実の世界をテストしておらず、実際には何もテストしていません。

テストと同じドメインで iframe を開いて、そこにコードをロードできます。その後、非同期テストでアサートできるようになります。

ただし、qUnit には必要なツールがすべて揃っているとは思えないため、ページのリロード/ナビゲーションが必要ないくつかのことをテストする場合は、別のテスト ツールを使用する必要があります。

他の投稿者が言及した別の方法は、ロケーション オブジェクトをモック アウトし、(ブラウザーではなく) コードの動作をテストすることです。

于 2014-04-12T10:32:44.627 に答える