Bri*_*ian 3 javascript mocking
作为一种有点滥用功能的hacky方法,我提出了使用这样的一些javascript的想法:
//fakefrob.js
var frob = function () {
return {
myFunc: function(){},
myFunc1: function(){},
myFunc2: function(){return 2;},
myFunc3: function(){},
myFunc4: function(){}
};
}();
Run Code Online (Sandbox Code Playgroud)
在这个例子中,真正的frob具有这些功能的实现.显然这是一个hack(函数大多数什么都不做或者有占位符返回值).如果我将foobar添加到realfrob.js,我必须将一个空的foobar实现添加到fakefrob.js.是否有一种方法(理想情况下不使用库)来编写fakefrob.js,frob.foobar像foobar 这样的行为被定义为function(){};,而没有实际添加foobar到fakefrob.js?
是否有一种方法(理想情况下不使用库)来编写fakefrob.js,
frob.foobar像foobar 这样的行为被定义为function(){};,而没有实际添加foobar到fakefrob.js?
你的意思是,一个catch-all属性,映射到无操作函数?不,JavaScript(目前)根本没有捕获所有属性.(我相信他们一些机制是正在考虑,作为代理的东西灌进派克在某个阶段的一部分.)
但是,如果您可以访问frob代码中的real ,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;
})();
Run Code Online (Sandbox Code Playgroud)
当然,如果要复制非功能属性,可以同时执行此操作.
请注意,我故意没有不包括hasOwnProperty在上述循环,因为我想你想你的模拟,包括功能,即使frob从原型继承他们.
如果frob继承了某些函数,并且您希望您的模拟hasOwnPropety对它们展现与原始frob 相同的行为,则可以获得更多创意:
// 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;
})();
Run Code Online (Sandbox Code Playgroud)
现在,如果原来frob有自己的foo(frob.hasOwnProperty("foo")是true)但是继承bar(frob.hasOwnProperty("bar")是false),hasOwnProperty你的模拟就会说完全相同的东西.
| 归档时间: |
|
| 查看次数: |
696 次 |
| 最近记录: |