2013-08-01 94 views
3

我有一个模拟资源,它只是函数的一个对象,在本例中只有一个。该函数返回另一个函数。代码如下所示:从另一个函数返回的函数执行间谍

var mockRevivhalResource = { 
    tenantOptions: function tenantOptions() { 
     return { 
      post: function post() { 
      } 
     } 
    } 
}; 
var RevivhalResource = mockRevivhalResource; 

我能够窥探tenantOptions()与spyOn(RevivhalResource, 'tenantOptions');,但我似乎无法窥探post()tenantOptions()回报。

唯一不会引发错误的是spyOn(RevivhalResource.tenantOptions(), 'post');但我相信我只是在post函数上设置了一个新实例的间谍,但是当角度应用程序调用RevivhalResource.tenantOptions().post();时它调用了一个新的post实例,因为如果我在嘲笑的职位功能console.log("test");测试打印出“测试”,即使我不让间谍callThrough。但在这件事上我可能是错的。

正在调用资源的控制代码是这样的

$scope.fun = function fun() { 
    RevivhalResource.tenantOptions().post(
     {...stuff...}, 
     function success(data) {...success handler...}, 
     function error(data) {...error handler...} 
    ) 
}; 

与RevivhalResource是一个angularjs提供商这样

angular.module('revivhal').provider('RevivhalResource', [function() { 
    ...init stuff... 
    this.$get = function ($resource) { 
     ...more init stuff... 
     return { 
      tenantOptions: function tenantOptions() { 
       return $resource(...path..., {...data...}, 
           post: {method: "POST"}); 
      } 
     } 
    } 
}]); 

而且我尝试使用间谍做确认已调用RevivhalResource.tenantOptions()。post()。然后我需要让间谍调用成功和错误处理程序来测试处理程序是否正确。

回答

4

你可以重构你的模拟所以其打造出的间谍返回其他间谍:

var postSpy = jasmine.createSpy(); 
var tenantOptionsSpy = jasmine.createSpy() 
var mockRevivhalResource = { 
    tenantOptions: tenantOptionsSpy.andReturn({post: postSpy}) 
}; 

mockRevivhalResource.tenantOptions().post() 
expect(tenantOptionsSpy).toHaveBeenCalled(); 
expect(postSpy).toHaveBeenCalled(); 
相关问题