実際にfoobarをfakefrob.jsに追加せずに、frob.foobar
foobarがとして定義されたように動作するように(理想的にはライブラリを使用せずに)fakefrob.jsを作成する方法はありますか?function(){};
つまり、no-op関数にマップされたキャッチオールプロパティですか?いいえ、JavaScriptには(現在)キャッチオールプロパティがまったくありません。(ある段階でパイクを降りてくるプロキシの一部として、それらのメカニズムが検討されていると思います。)
frob
ただし、コード内の実際にアクセスできる場合は、fakefrob
完全に自動的に生成できます。
// Assumes `frob` already exists
(function() {
var mock;
var name;
// Build the mock, with a function for each function
// on the real object.
mock = {};
for (name in frob) {
if (typeof frob[name] === "function") {
mock[name] = function() { };
}
}
// Replace the original
frob = mock;
})();
そしてもちろん、非関数プロパティをコピーしたい場合は、同時にそれを行うことができます。
プロトタイプから関数を継承している場合でも、モックに関数を含めたいと想定しているため、上記のループには意図的に含めていないことに注意してください。hasOwnProperty
frob
いくつかの関数frob
を継承し、モックがhasOwnPropety
元のフロブと同じ動作を示すようにしたい場合は、より創造的になることができます。
// Assumes `frob` already exists
(function() {
var mock;
var mockProto;
var name;
function FakeFrob() {
}
mockProto = FakeFrob.prototype;
// Build the mock, with a function for each function
// on the real object.
mock = new FakeFrob();
for (name in frob) {
if (typeof frob[name] === "function") {
if (frob.hasOwnProperty(name)) {
mock[name] = function() { };
}
else {
mockProto[name] = function() { };
}
}
}
// Replace the original
frob = mock;
})();
さて、オリジナルfrob
がそれ自身foo
(frob.hasOwnProperty("foo")
is true
)を持っていたが、継承されたbar
(frob.hasOwnProperty("bar")
is false
)である場合hasOwnProperty
、あなたのモックではまったく同じことを言うでしょう。