2016-10-04 5 views
0

Я использую пользовательский провайдер в своем приложении app.js, чтобы сделать бэкэнд-вызов, а затем в контроллерах просто вставлять этот провайдер и получать результат обещания (я делаю это, потому что вместо этого вызывать getLoggedUser в каждый контролер я получаю результаты от провайдера), и вместо того, чтобы делать 10 звонков, например, я сделаю только один в провайдере). Но я не могу протестировать этот метод $ get метода и тест, потому что бэкэнд-вызов никогда не выполняется.

Я получаю сообщение об ошибке:

Error: Unexpected request: GET https://localhost:8443/user/current 

app.js

angular.module('app', [ 
      ... 
     ]) 
     .config(config) 
     .run(run) 
     .controller('MainCtrl', MainCtrl) 
     .value('version', '1.1.0') 
     .provider('userProvider', function(){ 

      this.$get = ['AuthenticationService', 
       function(AuthenticationService) { 
        return AuthenticationService.getLoggedUser(); 
       }]; 
     }); 

TEST

/* jshint undef:false*/ 
(function() { 
    'use strict'; 

    describe('ListingController', function() { 
     var listingController, rootScope, scope, q, mockAuthenticationService, $httpBackend, service; 
     var provider = {}; 
     var mockCurrentUser = { 
      id: 1782, 
      name: "One, Coordinator", 
      roleId: [ 
       3, 10 
      ], 
      eauthId: "coodinator1" 
     }; 

     beforeEach(module('app')); 
     beforeEach(module('listing')); 
     beforeEach(function() { 
      module(function (userProviderProvider) { 
       provider = userProviderProvider; 
      }); 
     }); 
     beforeEach(inject(function($rootScope, $controller, $q, _$httpBackend_, _AuthenticationService_, userProvider, $injector) { 
      rootScope = $rootScope; 
      scope = rootScope.$new(); 
      $httpBackend = _$httpBackend_; 
      q = $q; 
      mockAuthenticationService = _AuthenticationService_; 
      // provider = userProvider; 
      service = $injector.invoke(provider.$get); 

      rootScope.$digest(); 

      listingController = $controller('ListingController', { 
       $scope : scope, 
       mockAuthenticationService : _AuthenticationService_ 
      }); 
     })); 
     describe('getLogged user and init',function(){ 
      it("should call getLogged function", function() { 
       listingController.getLoggedUser(); 

       rootScope.$digest(); 

       expect(service).toHaveBeenCalled(); 
      }); 
     }); 
    }); 
})(); 

Контроллер

function getLoggedUser() { 
      userProvider.then(function (data){ 
       // Here I am getting result from back end call from provider  which is good 
     }); 

Если я сделать что-то вроде этого в поставщика:

this.$get = function (AuthenticationService) { 
       return { 
        loggedUser : function() { 
         return AuthenticationService.getLoggedUser(); 
        } 
       } 
      } 

Затем я могу сделать что-то вроде этого в тесте:

spyOn(provider , 'loggedUser').and.callFake(function() { 
       var deferred = q.defer(); 
       deferred.resolve(mockCurrentUser); 
       return deferred.promise; 
      }); 

и это будет работать тест будет проходить, но с этот подход в каждом контроле, когда я пользователь userProvider.loggedUser(), затем он сделает дополнительный обратный вызов и с выше него только один раз, когда будет выполнен обратный вызов.

Обновление для Цейлоне

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

.provider('userProvider', function(){ 
      return { 
       $get: function(AuthenticationService) { 
        return new userService(AuthenticationService); 
       } 
      } 
     }); 

сервис

function userService(AuthenticationService) { 
     this.getLoggedUser = function() { 
      return AuthenticationService.getLoggedUser(); 
     } 
    } 
+0

определяют запрос ожидаемый URL в $ httpBackend –

+0

@ CeylanMumunKocabaş я добавить к нему функцию: он ("должен вызвать функцию getLogged", функция() { listingController.getLoggedUser(); $ httpBackend.expectGET ('https: // локальный: 8443/пользователь/ток') .respond (200); $ httpBackend.flush(); }); но опять же ошибка ... – Bukic

+0

'$ httpBackend.when ('GET', 'localhost: 8443/user/current'). Reply (200); $ httpBackend.expect ('GET', 'localhost: 8443/user/current'); ' –

ответ

0

Вот основная структура:

$httpBackend.when('GET', 'localhost:8443/user/current').respond(200, /*optional response callback function*/); 
$httpBackend.expect('GET', 'localhost:8443/user/current'); 

//here goes the function that makes the actual http request 

$httpBackend.flush(); 

Убедитесь, что вы определяете httpBackend вар - var httpBackend = $httpBackend;.

А также для того, чтобы проверить, вызвал ли сервис, вы должны использовать шпион.

spyOn(service, 'method').and.callThrough(); 

//here goes the function that calls the service 

expect(service.method).toHaveBeenCalled(); 

Вы комбинируете два блока выше, и вы должны быть в состоянии достичь того, чего хотите.

describe('something',function(){ 
      it("should do something", function() { 

       spyOn(service, 'method').and.callThrough(); 

       $httpBackend.when('GET', 'localhost:8443/user/current').respond(200,/*optional response callback function*/); 
       $httpBackend.expect('GET', 'localhost:8443/user/current'); 

       //call the function that makes http request and calls your service 

       rootScope.$digest(); 
       $httpBackend.flush(); 

       expect(service.method).toHaveBeenCalled(); 
      }); 
     }); 

И о вашей службе:

function myService(){ 
    var svc = this; 

    svc.myMethod = function(){ 
     return someDataOrPromise; 
    } 
} 
+0

Да, я знаю, что мне нужно использовать шпиона .. но проблема в том, что у этого провайдера нет функции ... У меня нет метода, поэтому какой способ добавить в spyOn? Это моя забота. – Bukic

+0

добавляет вам функциональность внутри сервиса.method и возвращает сервис. –

+0

Я не уверен, если я последую за ними. Функциональность для получения зарегистрированного пользователя в другой службе, которая возвращает промах. – Bukic