2017-03-06 5 views
1

Ich versuche, eine Test-Suite für eine Angular App zu schreiben, die Keycloak zur Authentifizierung verwendet.Einheit einen Keycloak-fähigen Winkel App testet

jedoch als Keycloak Sie erfordert manuell Bootstrap Winkel- und ein paar Abfangjäger eingerichtet, ich bin nicht in der Lage jeden Test Feuer aufgrund der folgenden Fehler:

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

Dies ist der Code für die Abfangjäger, dass den Fehler auslöst:

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 
     } 
    } 
    }) 

Mein Denken ist, dass ich die Abfangjäger verspotten sollte und haben es nur die Anfrage zurück. Aber ich sehe nicht, wie ich das tun könnte, da diese Abfangjäger nie irgendwo als Abhängigkeit injiziert wird, ist es einfach mit dem Block oben angegebenen und das ist es. Mein Verständnis von verspotteten Diensten ist, dass sie irgendwo injiziert werden müssen, um verspottet zu werden.

Meine Implementierung von Keycloak in Angular kommt direkt aus ihren Beispielen, ob das hilft. Ich bin für einen Test zu schreiben, aber noch keine Änderung

bearbeiten

Ich habe ein verspottet Auth-Modul in den Dienst zu injizieren versucht.
Ich bin zu Unit-Tests im Allgemeinen sehr neu, so dass ich ein bisschen dies auf der Spur verloren zu versuchen. Ich fühle mich wie ich weiß, wo das Problem ist, aber nicht, wie es zu lösen ist (Der Auth-Dienst wird während des Bootstrap der App hinzugefügt, ich muss es für Dinge zu arbeiten verspotten, aber es scheint, ich weiß nicht wie/wo zu verspotten es richtig)

Hier ist die gesamte Testcode:

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() 
    }) 
}) 

Edit 2

ich habe es geschafft, meine Vergangenheit Anfangsfehler zu erhalten, indem ein Mock-Version von Auth zu machen.
Ich habe jetzt Probleme mit der Implementierung einer Pseudoversion der JavaScript-Bibliothek von Keycloak.

Mein aktueller Mock-Code ist wie folgt:

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' 
     } 
    }) 
    })) 

und wirft diesen Fehler: Die

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 

Mein eigentlicher Test ist:

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

Vielleicht sollten Sie ‚Auth‘ auf Ihrem Modul injizieren – papakias

+0

Ja, das ist, was ich denke, das Problem ist. Der "Auth" -Dienst wird erstellt, wenn die App nach dem Initialisieren von Keycloak bootstrapped wird, also muss ich eine Kopie erstellen, damit alles funktioniert. Ich habe eine Bearbeitung mit meinem aktuellen (noch nicht funktionierenden) Code hinzugefügt, wo ich versuche, einen verspotteten Auth-Dienst zu injizieren. –

+0

Versuchen Sie, die erste Zeile Ihres alten Codes durch angular.module ('MPMReportGenerator', 'Auth') zu ersetzen. Fügen Sie auch "Auth" auf diese Weise zu Ihrem App-Modul hinzu. Kann das irgendetwas reparieren? – papakias

Antwort

1

Habe ich es endlich. Hier

ist der benötigte Code, wenn jemand will, um einen Winkel App mit keycloak testen:

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' 
    } 
    }) 
})) 

Beachten Sie, dass Sie wahrscheinlich andere Teile der keycloak Bibliothek verspotten müssen, wenn Sie die Abfangjäger zur Verfügung gestellt zu testen beabsichtigen, in die offiziellen Beispiele.

bearbeiten

Sie den Code nicht oben verwenden, werden die folgenden Arbeiten viel besser:

$provide.factory('Auth', function() { 
    return { 
    updateToken: function (minValidity) { 
     return { 
     success: function() { 
      return this 
     }, 
     error: function() { 
      return this 
     } 
     } 
    }, 
    token: 'thisisafaketokenfortesting' 
    } 
}) 
Verwandte Themen