- オフラインアクセスにwindow.applicationCacheを使用するWebアプリケーションがあります。
- appCacheを管理するすべてのコード(キャッシュのチェック/更新/交換など)は、「キャッシュコントローラー」オブジェクトにカプセル化されます。
「キャッシュコントローラー」機能をテストするための単体テストがあります。テストのために、ネイティブのwindow.applicationCacheオブジェクトを自分のモックバージョンに一時的に置き換えます(ブラウザーのappCache実装ではなく、コードのみをテストしたいため)。
window.applicationCache = { /* my appCache mock */ }; // unit tests run here. Code under test references window.applicationCache.
少し前(Chrome 16頃)、このアプローチは完全に機能しました。次に、MacとWindowsの両方のプラットフォームでChrome 17が、ブラウザのデフォルトのwindow.applicationCacheプロパティにパッチを適用する機能を削除しました(不思議なことに、Chrome26までのすべてのバージョンのChromeforLinuxで正常に動作します)。当時、私はこれについてChromiumのバグを記録しました。しかし残念ながら、そのバグレポートはまだ「未確認」としてリストされています。
とにかく、モジュールローダーとしてrequire.jsを使用して、アプリケーションを従来の「ブラウザーグローバル」(つまり、スクリプトタグを介して* .jsファイルをロードします。すべてのJSオブジェクトはグローバルです)からAMDスタイルのモジュールに移植しました。
AMD(またはCommonJS)の利点の1つは、依存性注入です。この場合、コードは、グローバル参照に依存するのではなく、依存オブジェクトへのローカル参照を取得します。
require(['foo'], function(Foo) {
var bar = new Foo();
});
...これにより、テストモードで「foo」のモックオブジェクトを渡すようにモジュールローダーを構成できるため、オブジェクトのモックを簡単に実行できます。
依存性注入に移行することで、applicationCacheの問題を回避できることを期待していました(モジュールに渡される「ウィンドウ」参照は、グローバルウィンドウオブジェクトまたはモックオブジェクトのいずれかである可能性があるため)。
ただし、require.jsに依存関係として「window」をモジュールに挿入する方法がわかりませんか?
'window'モジュールを定義することは可能ですか(おそらくshim configを使用しますか?)。次に、グローバルな「ウィンドウ」オブジェクトを操作する任意のコードに渡すことができますか?私がこのようなことをすることができるように:
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();
});