在函数内部绑定模拟函数
Bind Mocking Function inside function
我正在为我的应用程序编写 QUnit 测试用例。基本上我有三个文件
像下面。 DataServices.js 具有调用 ajax 的 getObjectDetails 方法
获取数据并传递回调结果。
Resolver.js 使用 require 加载 DataServices.js。
我正在为 Proxy.resolve 方法编写测试用例,其中我想避免实际的 api 调用,为此我在 Test.js 中创建了 DataServices 的模拟对象并调用 Resolver代理解析方法 .
我尝试使用 bind ,但仍然指向 DataServices.js 的实际方法,而不是我在 Test.js
中绑定的方法
DataServices.js
define(["module"], function(module) {
"use strict";
var Details = {
getObjectDetails :function(param,callback){
//API AJAX CALL
// Callback once done
}
};
return {Details : Details }
});
Resolver.js
define(["DataServices"],function(DataServices){
var Proxy= {
resolve : function(){
var Details = DataServices.Details ;
Details.getObjectDetails("xyz", function(result){
// Do Operation After Result
});
}
};
return {Proxy:Proxy}
});
Test.js
define(["Resolver.js" ],function(Resolver){
var DataServices= {
Details : {
getObjectDetails : function(undefined,onSuccess, onError) {
return onSuccess({"X":"Y"});
}
}
};
Resolver.Proxy.resolve.bind(DataServices);
Resolver.Proxy.resolve(); // This is still calling DataServices.js Details
// Not the above muck object
});
在简单程序中,我想调用模拟 z 函数,而不是 x 中的 z。
如何实现。
var x = {
z:function(b){
console.log("Z Actual Function..."+b);
},
a : function(){
this.z(3);
}
};
var z = function(b){
console.log("Mock ..."+b)
}
x.a.bind(z);
x.a();
//Z Actual Function...3
但我想要 Mock ...3 打印
第一个问题
使用.bind
创建一个new function,它不会改变原函数中this
的值。
要在您的案例中使用绑定,您可以改为执行以下操作:
var mockedA = x.a.bind(z);
mockedA();
如果您想立即调用该函数而不将其分配给变量,您可以使用 .call or .apply。
例如:
x.a.call(z); // runs `a()` immediately with `this` set to `z`
第二个问题
通过将 x.a
绑定到 z
,您可以将 this
的值更改为提供的值(模拟 z
函数)。因此,在 x.a
中,当您调用 this.z(3)
时,您实际上是在尝试调用 z.z(3)
,这是一个不存在的函数,因此会抛出 TypeError
.
可能有更好的方法,但这是回答您问题的方法:
var x = {
z:function(b){
console.log("Z Actual Function..."+b);
},
a : function(){
this.z(3);
}
};
var mock = {};
mock.z = function(b){
console.log("Mock ..."+b)
}
// with bind
var mockXA = x.a.bind(mock);
mockXA();
// with call
//x.a.call(mock)
我正在为我的应用程序编写 QUnit 测试用例。基本上我有三个文件 像下面。 DataServices.js 具有调用 ajax 的 getObjectDetails 方法 获取数据并传递回调结果。
Resolver.js 使用 require 加载 DataServices.js。
我正在为 Proxy.resolve 方法编写测试用例,其中我想避免实际的 api 调用,为此我在 Test.js 中创建了 DataServices 的模拟对象并调用 Resolver代理解析方法 .
我尝试使用 bind ,但仍然指向 DataServices.js 的实际方法,而不是我在 Test.js
中绑定的方法DataServices.js
define(["module"], function(module) {
"use strict";
var Details = {
getObjectDetails :function(param,callback){
//API AJAX CALL
// Callback once done
}
};
return {Details : Details }
});
Resolver.js
define(["DataServices"],function(DataServices){
var Proxy= {
resolve : function(){
var Details = DataServices.Details ;
Details.getObjectDetails("xyz", function(result){
// Do Operation After Result
});
}
};
return {Proxy:Proxy}
});
Test.js
define(["Resolver.js" ],function(Resolver){
var DataServices= {
Details : {
getObjectDetails : function(undefined,onSuccess, onError) {
return onSuccess({"X":"Y"});
}
}
};
Resolver.Proxy.resolve.bind(DataServices);
Resolver.Proxy.resolve(); // This is still calling DataServices.js Details
// Not the above muck object
});
在简单程序中,我想调用模拟 z 函数,而不是 x 中的 z。 如何实现。
var x = {
z:function(b){
console.log("Z Actual Function..."+b);
},
a : function(){
this.z(3);
}
};
var z = function(b){
console.log("Mock ..."+b)
}
x.a.bind(z);
x.a();
//Z Actual Function...3
但我想要 Mock ...3 打印
第一个问题
使用.bind
创建一个new function,它不会改变原函数中this
的值。
要在您的案例中使用绑定,您可以改为执行以下操作:
var mockedA = x.a.bind(z);
mockedA();
如果您想立即调用该函数而不将其分配给变量,您可以使用 .call or .apply。
例如:
x.a.call(z); // runs `a()` immediately with `this` set to `z`
第二个问题
通过将 x.a
绑定到 z
,您可以将 this
的值更改为提供的值(模拟 z
函数)。因此,在 x.a
中,当您调用 this.z(3)
时,您实际上是在尝试调用 z.z(3)
,这是一个不存在的函数,因此会抛出 TypeError
.
可能有更好的方法,但这是回答您问题的方法:
var x = {
z:function(b){
console.log("Z Actual Function..."+b);
},
a : function(){
this.z(3);
}
};
var mock = {};
mock.z = function(b){
console.log("Mock ..."+b)
}
// with bind
var mockXA = x.a.bind(mock);
mockXA();
// with call
//x.a.call(mock)