2015-02-09 6 views
0

У меня есть такая услуга.Как проверить HTTP-запрос в моем случае?

Просто попросите http получить запрос.

angular.module('myApp').service('TESTService', ['$http', 
    function($http) { 
     var request = function(url) { 
      return $http({ 
       method: 'GET', 
       url: url 
      }); 
     }; 
     return { 
      get: function(url) { 
       return request(url); 
      }    
     }; 
    } 
]); 

В мой контроллер, я назвал обслуживание

TESTService.get('/api/product' + id).success(
      function(result) { 
       console.log(result) 
      } 
     ); 

Мне нужно написать модульный тест для него

describe('test here', function() { 
var testCtrl, scope, httpBackend, testService; 

// Initialize the controller and a mock scope 
beforeEach(inject(function (_$controller_, _$rootScope_, _$httpBackend_, _TESTService_) { 
    scope = _$rootScope_.$new(); 
    httpBackend = _$httpBackend_; 
    testService = _TESTService_; 

    testCtrl = _$controller_('testCtrl', { 
     $scope: scope 
    }); 



    it('should return http data', function() { 
     var productData = { 
      data: [ 
       { 
        obj: { 
        id:'123' 
        } 
       }   
      ] 
     } 

     httpBackend.expectGET('/api/product/' + id).respond(productData); 

     TESTService.get('/api/product/' + id). 
      then(function(data) { 
       var result = data; 
      }) 

     httpBackend.flush(); 
     expect(result).toEqual(productData) 
    }); 
})); 

После выполнения теста, я получил

Error: Unexpected request: GET /api/product/undefined 

Как написать te чтобы убедиться, что он пройдет? Есть идеи? Большое спасибо!

+0

Как и в случае с примечанием, тестирование службы, использующей '$ http', является интеграционным тестом, а не модульным тестом. Единичные тесты могут выполняться изолированно, без наличия серверов, баз данных и т. Д. Обычно вам не нужно делать такие интеграционные тесты, так как «$ http» уже известен функционалом от Angular и вашего backend-сервиса должны быть протестированы на сервере. В других тестах эта услуга будет издеваться. – Claies

ответ

1

Ваша переменная «id» представляется неопределенной. Если бросить в

var id = 123; 

до этой строки:

httpBackend.expectGET('/api/product/' + id).respond(productData); 

Было бы позвонить/API/продукт/123 вместо.

Так может быть, вы искали это в первую очередь:

httpBackend.expectGET('/api/product/' + productData.data[0].obj.id).respond(productData); 

TESTService.get('/api/product/' + productData.data[0].obj.id). 

И так далее ... Надеюсь, что это помогает!

+0

Я сделал то, что вы предложили. Он по-прежнему говорит о неожиданном запросе: GET/api/product/undefined ожидает GET/api/product/12345 +1, хотя – FlyingCat

0

Попробуйте помещать одинарные кавычки вокруг объекта, который передается в $ http, то есть $ http ({method: 'GET', 'url', url});

angular.module('myApp').service('TESTService', ['$http', 
    function($http) { 
     var request = function(url) { 
      return $http({ 
       method: 'GET', 
       'url': url 
      }); 
     }; 
     return { 
      get: function(url) { 
       return request(url); 
      }    
     }; 
    } 
]); 
Смежные вопросы