在函数内绑定模拟函数



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

解析器.js使用 require 加载数据服务.js。

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

我尝试使用绑定,但仍然指向数据服务的实际方法.js而不是我在测试中绑定的方法.js

数据服务.js

define(["module"], function(module) {
"use strict";
 var Details = {
    getObjectDetails :function(param,callback){
       //API AJAX CALL
       // Callback once done
    }
 };
 return {Details : Details }
});

解析器.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}
});

测试.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

但我想要模拟...3 打印

第一个问题

使用 .bind 创建一个函数,它不会更改原始函数中 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绑定到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)

最新更新