2015-07-27 3 views
0

При тестировании устройства, которое использует $resource, что лучше всего - используя $httpBackend или издеваться над ресурсом?

У меня есть следующие услуги:

angular.module('example') 
    .factory('MyService', ['$resource', 
     function($resource) { 

     var service = $resource('/api/example/', {}, { 
      create: { 
      method: 'POST' 
      } 
     }); 

     var create = function(payload) { 
      return service.create({}, payload).$promise; 
     }; 

     return { 
      create: create 
     }; 
     } 
    ]); 

Использование $ httpbackend

describe('#create', function() { 
     it('should send a post request to api/example', function() { 
     $httpBackend.expectPOST('/api/example') 
      .respond({ 
      name: 'Something' 
      }); 

     MyService.create({ example: 'payload' }}); 

     $httpBackend.flush(); 

     expect(MyService.create).toEqual({example: 'payload'}) 
     }); 
    }); 
+0

Используйте $ httpBackend, это правильный путь. – Chandermani

ответ

2

При тестировании сервиса, используйте $httpBackend. Он разработан как резервный для обычного модуля $http, поэтому вы можете гарантировать, что ваш вызов службы через $resource и обратно делает правильную вещь.

Если вы хотите высмеять $resource, вы не будете осуществлять почти столько же пути кода. Вы также будете запутывать свои тесты с внедрением вашего сервиса, который может, по-видимому, переключиться с использования $resource на использование $http напрямую или какого-либо третьего модуля. В вашем тесте все равно, как делается HTTP-вызов, просто он правильный, и он возвращает некоторые ожидаемые данные.

Когда вы тестируете часть своей системы, отличную от службы, издевайтесь. В этом случае вам нужно только MyService.create, чтобы вернуть определенный объект, и вам все равно, как он его получит. Нет причин связывать не-сервисные тесты с HTTP-вызовом, который должен выполнить сервис.

Смежные вопросы