2017-03-06 18 views
1

Keycloakを認証に使用するAngularアプリ用のテストスイートを作成しようとしています。 Keycloakを手動で角度ブートストラップといくつかのインターセプタを設定する必要がありますよう単位Keycloak対応Angularアプリのテスト

しかし、私は次のエラーのための任意のテストを発射することができないよ:

Error: $injector:unpr 
Unknown Provider: AuthProvider <- Auth <- authInterceptor <- $http <- $templateRequest <- $route 

これは迎撃のためのコードであることエラーを発生させます:

angular.module('MPMReportGenerator') 
    .factory('authInterceptor', function authInterceptor ($q, Auth, $log) { 
    return { 
     request: function (config) { 
     var deferred = $q.defer() 
     Auth.updateToken(5).success(function() { 
      config.headers = config.headers || {} 
      config.headers.Authorization = 'Bearer ' + Auth.token 
      deferred.resolve(config) 
     }).error(function() { 
      deferred.reject('Failed to refresh token') 
     }) 
     $log.info(deferred.promise) 
     return deferred.promise 
     } 
    } 
    }) 

私は考えて、私は傍受者を嘲笑して、要求を返さなければなりません。 しかし、私はこのインターセプタが依存性としてどこにも注入されないので、私はそれを行うことができませんでした。単に上のブロックで宣言されているだけです。嘲笑されたサービスの私の理解は、彼らが嘲笑されるためにどこかに注入される必要があるということです。

KeycloakをAngularに実装したのは、その例からわかります。

私はのためにテストを書いているサービスへの嘲笑認証モジュールを注入しようとしてきた

編集、まだ変化がありません。
私は一般的な単体テストには新しいので、これを追跡しようとすると少し迷っています。私は問題がどこにあるかを知っているように感じるが、解決する方法ではないと感じている(Authサービスは、アプリケーションのブートストラップ中に追加されている。私は仕事のためにそれを嘲笑する必要があるが、

はここで全体のテストコードです)それを適切に模擬する:

describe('Services', function() { 
    'use strict' 

    beforeEach(module('MPMReportGenerator')) 

    module(function ($provide) { 
    $provide.factory('Auth', function() { 
     return null 
    }) 
    }) 

    var sectionService, $httpBackend, mockAuth 
    beforeEach(inject(function (_sectionService_, _$httpBackend_, Auth) { 
    sectionService = _sectionService_ 
    $httpBackend = _$httpBackend_ 
    mockAuth = Auth 
    })) 

    it('should get sections', function() { 
    $httpBackend.expect('GET', '/MPMReportGenerator/api/categories/all').respond(200) 

    sectionService.getSections() 

    expect($httpBackend.flush).not.toThrow() 
    }) 
}) 

編集2

私は認証のモックバージョンを作ることによって、私の最初のエラーを乗り越えることができました。
私は現在、KeycloakのJavascriptライブラリの模擬バージョンを実装する際に問題に直面しています。

私の現在のモックコードは以下の通りです:

beforeEach(module(function ($provide) { 
    $provide.factory('Auth', function ($q) { 
     return { 
     updateToken: function (minValidity) { 
      return { 
      success: function (fn) { 
       var deferred = $q.defer() 
       deferred.resolve('') 
       fn(deferred.promise) 
      }, 
      error: function (fn) { 
       var deferred = $q.defer() 
       deferred.resolve('Error') 
       fn(deferred.promise) 
      } 
      } 
     }, 
     token: 'thisisafaketokenfortesting' 
     } 
    }) 
    })) 

そして、このエラーがスローされます。

Expected function not to throw, but it threw TypeError: undefined is not an object (near '...}).error(function() {...'). 
    target/MPMReportGenerator-1.0.0/js/app.service.spec.js:42:43 
    [email protected]://localhost:9876/context.js:151:17 

は私の実際のテストはこれです:

it('should get sections', function() { 
    $httpBackend.expect('GET', '/MPMReportGenerator/api/categories/all').respond(200) 
    sectionService.getSections() 
    expect($httpBackend.flush).not.toThrow() 
    }) 
+0

は、たぶん、あなたがあなたのモジュール – papakias

+0

に「認証」を注入しなければならないええ、それは私が問題だと思うものです。 "Auth"サービスは、Keycloakが初期化された後にアプリケーションがブートストラップされたときに作成されるため、すべてを動作させるためのモックを用意する必要があります。 モックされたAuthサービスを注入しようとしている現在の(まだ機能していない)コードで編集を追加しました。 –

+0

古いコードの最初の行をangular.module( 'MPMReportGenerator'、 'Auth')に置き換えてください。また、この方法であなたのアプリケーションモジュールに 'Auth'を追加します。これで何か修正されますか? – papakias

答えて

1

私はついにそれを考え出しました。ここで

誰もがkeycloakと角度アプリをテストしたい場合に必要なコードです:あなたはで提供インターセプタをテストする場合、あなたはおそらくkeycloakライブラリの他の部分を模擬する必要があります

beforeEach(
    module(function ($provide) { 
    $provide.factory('Auth', function ($q) { 
     return { 
     updateToken: function (minValidity) { 
      return { 
      success: function() { 
       return { 
       error: function() { 
        var deferred = $q.defer() 
        return deferred.promise 
       } 
       } 
      } 
      } 
     }, 
     token: 'thisisafaketokenfortesting' 
    } 
    }) 
})) 

注意公式の例。

編集

上記のコードを使用しないでください、下記の作品より良い:

$provide.factory('Auth', function() { 
    return { 
    updateToken: function (minValidity) { 
     return { 
     success: function() { 
      return this 
     }, 
     error: function() { 
      return this 
     } 
     } 
    }, 
    token: 'thisisafaketokenfortesting' 
    } 
}) 
関連する問題