2016-10-04 15 views
0

私のapp.jsでカスタムプロバイダを使用して、バックエンドコールを行い、コントローラにそのプロバイダを注入して約束の結果を得るだけです(getLoggedUserをすべてのコントローラ私はちょうどプロバイダからの結果を取得している)と10コールを行う代わりに、私はプロバイダーでただ1つを作成します)。しかし、このプロバイダ$ 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()を使用したときに、すべてのコントロールでこのアプローチを使用すると、追加のバックエンド呼び出しが行われ、上記の場合はバックエンド呼び出しが1回だけ行われます。セイラン

ため

アップデート私はあなたがサービスを呼び出し、方法で他のサービスの追加の呼び出しからgetLoggedUserを呼び出すことをお勧めしますようにした場合、私は機能せずに持っているだけではなく、いずれかのよう...毎回行われています。

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

サービス

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

$ httpBackend –

+0

@CeylanMumunKocabaşで予想されるURL要求を定義し、私はそれに追加するには、機能: それ( "getLogged関数を呼び出す必要があります"、機能(){ listingController.getLoggedUser(); $ httpBackend.expectGET( 'https://ではlocalhost:8443 /ユーザー/現在').respond(200); $ httpBackend.flush(); }); もう一度同じエラーが発生します... – Bukic

+0

$ httpBackend.when( 'GET'、 'localhost:8443/user/current')。respond(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定義していることを確認してください - var httpBackend = $httpBackend;を。

また、サービスが呼ばれたかどうかを確認するために、スパイを使用する必要があります。

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

//here goes the function that calls the service 

expect(service.method).toHaveBeenCalled(); 

上記の2つのブロックを組み合わせることで、必要なものを達成できるはずです。

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

service.methodの中に機能を入れてサービスを返します。 –

+0

私が従うかどうかわかりません。ログインしたユーザーを取得する機能は、promiseを返す他のサービスにあります。 – Bukic

関連する問題