2013-02-25 11 views
17
  1. オフラインアクセスでwindow.applicationCacheを使用するWebアプリケーションがあります。
  2. appCache (キャッシュの確認/更新/スワッピングなど)を管理するすべてのコードは、 「キャッシュコントローラ」オブジェクトにカプセル化されています。
  3. 私は "キャッシュコントローラ"機能をテストするための単体テストを持っています。テストのために、私は一時的に ネイティブwindow.applicationCacheオブジェクトを私自身のモックで置き換えます。 バージョン(私は私のコードではなく、 appCache実装をテストしたいと思っています)。このアプローチは完全に働いたrequire.jsのグローバルウィンドウオブジェクトをモックします

    しばらく前
    window.applicationCache = { /* my appCache mock */ }; 
    // unit tests run here. Code under test references window.applicationCache. 
    

(年頃。クローム16)。その後、Macの& WindowsプラットフォームのChrome 17では、ブラウザのデフォルトのwindow.applicationCacheプロパティにパッチを当てる機能が削除されました(奇妙なことに、Chrome 26以降のすべてのバージョンでChrome for Linuxでは問題なく動作します)。当時、私はlogged a Chromium bugでした。残念ながらそのバグレポートは未確認のまま残っています。

とにかく、私はちょうどrequire.jsをモジュールローダーとして使用して、従来の「ブラウザグローバル」(つまり、スクリプトタグ経由で* .jsファイルをロードし、すべてのJSオブジェクトはグローバル)からアプリケーションをAMDスタイルのモジュールに移植しました。

AMD(またはCommonJS)の利点の1つは、グローバル参照に頼るのではなく、コードがローカル参照を任意の依存オブジェクトに取得する依存性注入です。あなたは、テストモードで「foo」でのモックオブジェクトを渡すためにモジュールローダを設定することができるので、オブジェクトのモックを行うことが容易になり

require(['foo'], function(Foo) { 
    var bar = new Foo(); 
}); 

...。

私はdependency-injectionに移動することで、私のapplicationCacheの問題を回避することができたと思いました。モジュールに渡された 'window'リファレンスがグローバルウィンドウオブジェクトかモックオブジェクトのいずれかになる可能性があります。

しかし私はrequire.jsに私のモジュールへの依存として 'window'を挿入する方法がわかりません。

'window'モジュールを定義することは可能でしょうか(おそらくshim configを使用していますか?)。グローバルな 'window'オブジェクトで動作するコードに渡すことができますか?だから私はこのような何かをすることができた:

require(['???'], function(window) { 
    // 'window' here is the real window object, or for testing it's a mock window object 
    window.applicationCache.update(); 
}); 

...ここで '???'ウィンドウオブジェクトを参照するモジュール名です。

"ウィンドウ"をエクスポートする独自のモジュールを定義する必要がありますか?これはユニットテストのために別の方法でマップすることができます。

// window.js 
define(function() { 
    return window; // real global window object 
}); 

// window-mock.js 
define(function() { 
    return { 
    applicationCache: { /* mock version of appCache */ } 
    } 
}); 

// for unit testing, remap 'window' to the mock version 
require.config({ 
    map: { 
    "cache-controller": { 
     "window": "window-mock" 
    } 
    } 
}); 

// cache-controller.js 
require(['window'], function(window) { 
    window.applicationCache.update(); 
}); 

答えて

6

私は自分の質問に答えました。上記のようにwindow.jsとwindow-mock.jsモジュールを作成することにしました。ユニットテストを実行するときに模擬バージョンを渡すことができ、正常に動作しているときには '本当の'ウィンドウオブジェクトを使用することができました。

関連する問題