モジュール内の関数がモジュールの他の関数を直接 (つまり、モジュールに対してローカルな参照を使用して)呼び出す場合、これらの呼び出しを外部からインターセプトする方法はありません。ただし、モジュール内の関数がモジュール外のコードと同じ方法でモジュールの関数を呼び出すようにモジュールを変更すると、これらの呼び出しをインターセプトできます。
必要なものを許可する例を次に示します。
define([], function () {
"use strict";
var foo = function(){
return exports.bar();
};
var bar = function(){
return "original";
};
var exports = {
foo: foo,
bar: bar
};
return exports;
});
重要なのは、直接呼び出すのでfoo
はなく、exports
アクセスすることです。bar
ここに実行可能な例を示しました。spec/main.spec.js
ファイルには次が含まれます。
expect(moduleA.foo()).toEqual("original");
spyOn(moduleA, "bar").andReturn("patched");
expect(moduleA.foo()).toEqual("patched");
bar
関数にパッチが適用されていますfoo
が、パッチの影響を受けていることがわかります。
また、永続的にテスト コードによってエクスポートが汚染されるのを避けるために、モジュールがテスト環境で実行され、テスト モードでのみテストに必要な関数をエクスポートするかどうかを判断するために環境チェックを行うことがあります。これが私が書いた実際のコードの例です:
var options = module.config();
var test = options && options.test;
[...]
// For testing only
if (test) {
exports.__test = {
$modal: $modal,
reset: _reset,
is_terminating: _is_terminating
};
}
requirejs 構成がモジュールを ( を使用してconfig
) 構成し、test
オプションが true 値に設定されている場合、__test
エクスポートには、モジュールのテスト時にエクスポートするいくつかの追加項目を含むシンボルがさらに含まれます。それ以外の場合、これらのシンボルは使用できません。
編集:上記の最初の方法で、内部関数へのすべての呼び出しの前に を付けなければならないことが気になる場合は、次のようexports
にすることができます。
define(["module"], function (module) {
"use strict";
var debug = module.config().debug;
var exports = {};
/**
* @function
* @param {String} name Name of the function to export
* @param {Function} f Function to export.
* @returns {Function} A wrapper for <code>f</code>, or <code>f</code>.
*/
var _dynamic = (debug ?
function (name, f) {
exports[name] = f;
return function () {
// This call allows for future changes to arguments passed..
return exports[name].apply(this, arguments);
};
} :
_dynamic = function (name, f) { return f; });
var foo = function () {
return bar(1, 2, 3);
};
var bar = _dynamic("bar", function (a, b, c) {
return "original: called with " + a + " " + b + " " + c;
});
exports.foo = foo;
return exports;
});
RequireJS 構成が上記のモジュールを構成し、これdebug
が true になると、 によってラップされた関数がエクスポートされ_dynamic
、を経由せずにそれらを参照できるローカル シンボルが提供されますexports
。が false の場合debug
、関数はエクスポートされず、ラップされません。この方法を示すために例を更新しました。例にmoduleB
あります。