gpt4 book ai didi

javascript - 在函数内部绑定(bind)模拟函数

转载 作者:行者123 更新时间:2023-12-03 05:19:57 25 4
gpt4 key购买 nike

我正在为我的应用程序编写 QUnit 测试用例。基本上我有三个文件像下面这样。 DataServices.js 有 getObjectDetails 方法,该方法执行 ajax 调用获取数据并将结果传递给回调。

Resolver.js 使用 require 加载 DataServices.js。

我正在为 Proxy.resolve 方法编写测试用例,其中我想避免实际的 api 调用,为此我在 Test.js 中创建了 DataServices 的模拟对象并调用 Resolver 代理解析方法。

我尝试使用bind,但仍然指向DataServices.js的实际方法,而不是我在Test.js中绑定(bind)的方法

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 的值。

要在您的情况下使用绑定(bind),您可以这样做:

var mockedA = x.a.bind(z);
mockedA();

如果您想立即调用该函数而不将其分配给变量,您可以使用 .call.apply相反。

例如:

x.a.call(z); // runs `a()` immediately with `this` set to `z`

第二个问题

通过将 x.a 绑定(bind)到 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)

关于javascript - 在函数内部绑定(bind)模拟函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41430548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com