2015-03-30 4 views
2

Я новичок в тестировании кармы-жасмина. Я написал одну службу, которая делает http get call api и возвращает объект данных.Как проверить функции внутри angularjs-сервисов с помощью jasmine-karma

app.service('service_name',['$http',function($http){ 
    this.getData=function(urlPath){ 
     var Data = $http.get(path).success(function(data){ 
       var getData = data; 
       console.log("getData success"); 
       return getData; 
      }).error(function(response){ 
       var getData = response; 
       console.log("getData error"); 
       return getData; 
      }); 

     console.log(Data); 
     return Data; 
    }; 
}]); 

От контроллера я передаю URL этой функции сервиса и получение данных с помощью .then() обратного вызова;

service_name.getData(url).then(function(data){ 
    console.log('expected data: ', data); 
}); 
+0

Возможный дубликат [Уклонение от Angularjs не разрешается в модульном тесте] (http://stackoverflow.com/questions/15048132/angularjs-promise-not-being-resolved-in-unit-test) –

+0

, когда я запускаю свой приложение в любом браузере все вызовы ajax работают нормально. Теги ajax вызываются при загрузке контроллера. Но когда я запускаю конфигурацию тестирования кармы, эти контроллеры загружаются, но все вызовы ajax пропускаются. –

+0

Вы показываете код службы, а не о контроллерах. Что вы хотите проверить? Если вы хотите активировать вызовы с контроллера, вы должны установить: http://nathanleclaire.com/blog/2013/12/13/how-to-unit-test-controllers-in-angularjs-without-setting-your-hair- on-fire/ –

ответ

1

Вот как я это сделал:

Во-первых, установка тестовая среда в соответствии с этим article

Тогда в тестовой спецификации, используйте следующий шаблон тест, чтобы проверить свои функции в обслуживании, спасибо Бен Леш за его большой blog

'use strict'; 
 

 
describe('service_name', function() { 
 
    var service_name, 
 
    httpBackend, 
 
    resource; 
 

 
    beforeEach(function() { 
 
    module('yourAppName'); 
 

 
    // The injector ignores leading and trailing underscores here (i.e. _$httpBackend_). 
 
    // This allows us to inject a service but then attach it to a variable 
 
    // with the same name as the service in order to avoid a name conflict. 
 
    inject(function($injector, _service_name_) { 
 
     service_name = _service_name_; 
 
     httpBackend = $injector.get('$httpBackend'); 
 
    }); 
 
    }); 
 

 
    // make sure no expectations were missed in your tests. 
 
    // (e.g. expectGET or expectPOST) 
 
    afterEach(function() { 
 
    httpBackend.verifyNoOutstandingExpectation(); 
 
    httpBackend.verifyNoOutstandingRequest(); 
 
    }); 
 

 
    it('should have a getData function', function() { 
 
    expect(angular.isFunction(service_name.getData)).toBe(true); 
 
    }); 
 

 
    it('getData function should return data object if http request is successful', function() { 
 
    var expectedData = data; 
 
    httpBackend.expectGET('urlPath') 
 
     .respond(expectedData); 
 

 
    var actualResult; 
 
    service_name.getData().then(function(response) { 
 
     actualResult = response; 
 
    }); 
 

 
    httpBackend.flush(); 
 

 
    expect(actualResult).toEqual(expectedData); 
 
    }); 
 

 
    it('getData should return error message when http request is unsuccessful', function() { 
 
    httpBackend.expectGET('urlPath').respond(500); 
 

 
    var promise = service_name.getData('urlPath'), 
 
     result = null; 
 

 
    promise.then(function(foo) { 
 
     result = foo; 
 
    }, function(reason) { 
 
     result = reason; 
 
    }); 
 
    httpBackend.flush(); 
 
    expect(result).toBe("getData error"); 
 
    }); 
 

 
});

Надеюсь, что это поможет.

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