2016-08-16 2 views
1

Ich bin neu in TDD und versuche, einen Test zu verdrahten, und bin seit Stunden darauf festgefahren. Ich halte die folgende Fehlermeldung erhalten:Modul/Dienst für Komponententest nicht einspeisen können

[$injector:modulerr] Failed to instantiate module AuthInterceptor due to: 
    Error: [$injector:nomod] Module 'AuthInterceptor' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument. 
    http://errors.angularjs.org/1.5.8/$injector/nomod?p0=AuthInterceptor 
     at client/test/index.js:8237:13 
     at client/test/index.js:10251:18 
     at ensure (client/test/index.js:10175:39) 
     at module (client/test/index.js:10249:15) 
     at client/test/index.js:12786:23 
     at forEach (client/test/index.js:8490:21) 
     at loadModules (client/test/index.js:12770:6) 

Hier ist mein Test:

import angular from 'angular'; 
import serviceModule from './auth.interceptor' 

describe('wire.common.services',() => { 

    describe('AuthService',() => { 
    let AuthService; 

    beforeEach(angular.mock.module(serviceModule.name)); 
    beforeEach(angular.mock.module(($provide) => { 
     $provide.factory('$q',() => ({})); 
     $provide.factory('$log',() => ({})); 
    })); 

    beforeEach(angular.mock.inject((_AuthService_) => { 
     AuthService = _AuthService_; 
    })); 

    it('should be a dummy test',() => { 
     expect(2).toEqual(2); 
    }); 

    }); 

}); 

Der eigentliche Code Ich bin Test:

export default function AuthInterceptor($q, $injector, $log) { 
    'ngInject'; 
    return { 
    request(config) { 
     let AuthService = $injector.get('AuthService'); 
     if (!config.bypassAuthorizationHeader) { 
     if (AuthService.jwtToken) { 
      config.headers.Authorization = `Bearer ${AuthService.jwtToken}`; 
     } else { 
      $log.warn('Missing JWT', config); 
     } 
     } 
     return config || $q.when(config); 
    }, 
    responseError(rejection) { 
     let AuthService = $injector.get('AuthService'); 
     if (rejection.status === 401) { 
     AuthService.backToDAS(); 
     } 
     return $q.reject(rejection); 
    } 
    }; 

} 

Ich verstehe nicht, warum ich bin diesen Fehler bekommen - ich habe alle Abhängigkeiten für den Service bereitgestellt und folge dem, was in der eckigen Dokumentation beschrieben ist. jede Hilfe wird geschätzt!

-Update, das ist der Code, den ich mit gegangen:

import angular from 'angular'; 
import AuthInterceptor from './auth.interceptor' 

describe('Auth interceptor test',() => { 

    describe('AuthInterceptor test',() => { 
    let $httpBackend, $http, authInterceptor = AuthInterceptor(); 

    beforeEach(angular.mock.module(($httpProvider, $provide) => { 
     $httpProvider.interceptors.push(AuthInterceptor); 
     $provide.factory('AuthService',() => ({ 
     jwtToken: "hello", 
     backtoDAS: angular.noop 
     })); 
    })); 

    beforeEach(inject(function($injector) { 
     $httpBackend = $injector.get('$httpBackend'); 
     $http = $injector.get('$http'); 
    })) 


    it('should have a request function',() => { 
     let config = {}; 
     expect(authInterceptor.request).to.be.defined; 
     expect(authInterceptor.request).to.be.a('function'); 

    }) 

    it('the request function should set authorization headers', (done) => { 
     $httpBackend.when('GET', 'http://jsonplaceholder.typicode.com/todos') 
     .respond([{ 
      id: 1, 
      title: 'Fake title', 
      userId: 1 
     }]); 
     $http.get('http://jsonplaceholder.typicode.com/todos').then(function(transformedResult) { 

     expect(transformedResult.config.headers.Authorization).to.be.defined; 
     expect(transformedResult.config.headers.Authorization).to.contain('Bearer') 
     done(); 
     }) 
     $httpBackend.flush(); 
    }); 

    it('should have a responseError function',() => { 
     expect(authInterceptor.responseError).to.be.defined; 
     expect(authInterceptor.responseError).to.be.a('function'); 
     //TODO: test return value 
     // see that AuthService.backToDAS() 
    }) 

    it('the error function should call backtoDAS', (done) => { 
//the URL should be one that gives me a 401 
     $httpBackend.when('GET', 'https://wwws.mint.com/overview.event') 
     .respond([{ 
      id: 1, 
      title: 'Fake title', 
      userId: 1 
     }]); 
     $http.get('https://wwws.mint.com/overview.event').then(function(transformedResult) { 

     console.log(transformedResult); 
     done(); 
     }, function(error){ 
     console.log(error); 
     done(); 
     }) 

    }); 

    }) 
}); 

Antwort

1

Dies bedeutet, dass AuthInterceptor eckige Modul wurde nicht definiert (und übrigens, unter Berufung auf name ist unsicher).

AuthInterceptor ist kein Modul, sondern eine injizierbare Funktion. Es kann in funktioneller Art und Weise, wie $http Abfangjäger getestet werden:

beforeEach(angular.mock.module(($httpProvider) => { 
    $httpProvider.interceptors.push(AuthInterceptor); 
}); 

... 

it('...',() => { 
    $httpBackend.when(...).respond(...); 
    $http.get(...).then((interceptedResult) => { 
    expect(interceptedResult)... 
    }); 

    $rootScope.$digest(); 
}); 

oder direkt:

it('...',() => { 
    let interceptor = $injector.invoke(AuthInterceptor); 
    expect(interceptor).toEqual({ 
    request: jasmine.any(Function), 
    requestError: jasmine.any(Function) 
    }); 

    var config = { headers: {} }; 
    interceptor.request(config); 
    expect(config)... 
}); 

Dienstleistungen, die Nebenwirkungen (AuthService, $log) produzieren sollte stubbed werden.

+0

Vielen Dank für Ihre tolle Antwort. Ich habe es geschafft! Das einzige, was übrig bleibt, testet die ResponseError-Funktion, ich werde meine Frage mit diesem Code aktualisieren. Kennen Sie eine gute Möglichkeit, die Aktionen der Antwortfehlerfunktionen zu verspotten, so wie ich die Anforderungsfunktion im authInterceptor verspottet habe? – devdropper87

+0

Hier ist meine Follow-up-Frage: http://stackoverflow.com/questions/38985850/angular-js-karma-chai-mock-an-authorization-error – devdropper87

0

Das bedeutet, dass ng Modul zu laden versagt. :) Und dies geschieht während des Bootstrappings der App und des ng-Moduls als erstes in einem Array mit drei Elementen: ng, ['$ provide', Funktion ($ provide) {...}] und meinem eigenen Anwendungsmodul. Es schlägt beim Laden des ersten fehl.

Ich habe Konsole angesehen und ich habe diese Fehlermeldung daraus kopiert. Es gibt keinen anderen Fehler. Keiner.

Ich hoffe, dass Sie auf diesen bestimmten Link geklickt haben und sehen, dass es Ihnen keine spezifischen Ideen dazu gibt. Leider habe ich dieses GitHub-Problem hinzugefügt, nachdem ich andere Ressourcen ausgeschöpft habe. Ich bin gerade dabei, Winkelcode zu debuggen, um weiter zu kommen.