2013-08-01 4 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();, он вызывает новый экземпляр сообщения, потому что если У меня есть console.log("test"); в функции посмеянного сообщения, тесты распечатывают «тест», даже если я не позволяю шпионскому вызову. Но я мог ошибаться по этому поводу.

код контроллера, который звонит ресурс, как это

$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(); 
Смежные вопросы