ウィンドウオブジェクトをモックするにはどうすればよいですか?私は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が未定義であるというエラーが表示されます。
問題は、ウィンドウオブジェクトのプロパティを上書きするだけです。そして、それができれば、ブラウザも同様にできます。したがって、誰もがアクセスできるグローバルオブジェクトの関数またはプロパティをモックすることは、一般的には良い考えではありません。アクセスしようとすると、変更がそこにあるかどうかを確認できないからです。
依存性注入 になります。 unitに焦点を合わせて、コードユニットをテスト可能にする一般的なパターン。どういう意味ですか。新しいオブジェクトを作成したり、グローバルオブジェクトにアクセスしたりするときは、unit機能だけでなく、新しく作成したオブジェクトまたはグローバルオブジェクトの機能もテストします。その前に追加するには、unitに新しいオブジェクトを作成するのではなく、それらを渡します。通常、コンストラクターでこれを行いますが、JavaScript関数では、コンストラクターとして関数本体を持つオブジェクトであるため、単純に関数に依存関係を渡すこともできます。
したがって、あなたの場合、関数はグローバルウィンドウオブジェクトに依存します。したがって、グローバルウィンドウオブジェクトにアクセスしようとする代わりに、それをパラメーターとして関数に渡します。このようにすると、実動コードのウィンドウオブジェクトと、引数を指定した単純なJavaScriptオブジェクトをテストに渡すことができます。
function youWannaTest(w){
console.log(w.arguments[0]);
}
拡張機能で、次のような関数を呼び出します。
youWannaTest(window);
テストでは、次のような関数を呼び出します。
youWannaTest({arguments: ['someValue']});
また、依存性注入が最もクリーンなソリューションだと思います。
あなたの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()
})
はい、ウィンドウオブジェクトをモックできます。
最初に行う必要があるのは、JSコードを1つ変更することです。windowを$ windowに置き換えます。
次に、以下のコードを使用してウィンドウをモックできます。
var window = {
arguments : ['url']
};
今specファイルに:beforeEachブロックで
$controller('controllerName', {$window : window});