在函数内绑定模拟函数

时间:2017-01-02 16:52:56

标签: javascript jquery unit-testing qunit

我正在为我的应用程序编写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

});

在简单的程序中,我想调用mock 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来打印

1 个答案:

答案 0 :(得分:1)

第一个问题

使用.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绑定到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)