web-dev-qa-db-ja.com

ジャスミンモックウィンドウオブジェクト

ウィンドウオブジェクトをモックするにはどうすればよいですか?私はFirefoxの拡張機能を実行していますが、ジャスミンをjavascriptのテストに使用したいと思います。

私のjavascriptには


function submit() {
...
var url = window.arguments[0];
...
}

明らかに、window.openDialogからパラメーターを渡さない場合、そのオブジェクトは存在しないため、ジャスミンでwindow.arguments [0]をモックする必要があります。

これは「with」でそれをto笑する私の試みです


it("should submit to server", function() {

        var localContext = {
            "window": {
                arguments: ["http://localhost"]
            }

        }

        with(localContext);

しかし、私はまだこのエラーを受け取りますTypeError:undefinedのプロパティ '0'を読み取ることができません

window.arguments[0]

テスト内では、「http:// localhost」が正しく出力されます。しかし、submit()メソッドになると、window.argumentが未定義であるというエラーが表示されます。

42
toy

問題は、ウィンドウオブジェクトのプロパティを上書きするだけです。そして、それができれば、ブラウザも同様にできます。したがって、誰もがアクセスできるグローバルオブジェクトの関数またはプロパティをモックすることは、一般的には良い考えではありません。アクセスしようとすると、変更がそこにあるかどうかを確認できないからです。

依存性注入 になります。 unitに焦点を合わせて、コードユニットをテスト可能にする一般的なパターン。どういう意味ですか。新しいオブジェクトを作成したり、グローバルオブジェクトにアクセスしたりするときは、unit機能だけでなく、新しく作成したオブジェクトまたはグローバルオブジェクトの機能もテストします。その前に追加するには、unitに新しいオブジェクトを作成するのではなく、それらを渡します。通常、コンストラクターでこれを行いますが、JavaScript関数では、コンストラクターとして関数本体を持つオブジェクトであるため、単純に関数に依存関係を渡すこともできます。

したがって、あなたの場合、関数はグローバルウィンドウオブジェクトに依存します。したがって、グローバルウィンドウオブジェクトにアクセスしようとする代わりに、それをパラメーターとして関数に渡します。このようにすると、実動コードのウィンドウオブジェクトと、引数を指定した単純なJavaScriptオブジェクトをテストに渡すことができます。

function youWannaTest(w){
    console.log(w.arguments[0]);
}

拡張機能で、次のような関数を呼び出します。

youWannaTest(window);

テストでは、次のような関数を呼び出します。

youWannaTest({arguments: ['someValue']});
61

また、依存性注入が最もクリーンなソリューションだと思います。

あなたのJS:

function submit(_window) {
    _window = _window || window
    ...
    var url = _window.arguments[0];
    ...
}

ユニットテスト:

it('works like a dream', function () {
    var _window = { arguments: ['url'] }
    expect(submit(_window)).toBeTotallyAwesome()
})
3
A.Williams

はい、ウィンドウオブジェクトをモックできます。

最初に行う必要があるのは、JSコードを1つ変更することです。window$ windowに置き換えます。

次に、以下のコードを使用してウィンドウをモックできます。

var window = {
  arguments : ['url']
};

今specファイルに:beforeEachブロックで

$controller('controllerName', {$window : window});
0
Ankit Shah