2013-08-01 153 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(); 
相關問題