web-dev-qa-db-fra.com

Angular n'est pas disponible dans le test Karma Jasmine

J'utilise angular pile complète pour le développement, mon fichier karma.conf.js est

files: [             
    'app/bower_components/jquery/jquery.js',
    'app/bower_components/angular/angular.js',
    'app/bower_components/angular-mocks/angular-mocks.js',
    'app/bower_components/angular-cookies/angular-cookies.js',
    'app/bower_components/angular-resource/angular-resource.js',
    'app/bower_components/angular-route/angular-route.js',
    'app/bower_components/angular-sanitize/angular-sanitize.js',
    'app/bower_components/angular-scenario/angular-scenario.js',
    'app/scripts/controllers/*.js',
    'app/scripts/directives/*.js',
    'app/scripts/services/*.js',
    'app/scripts/app.js',
    'lib/routes.js',           
    'test/karma/unit/**/test.spec.js'      
],

Spécifications de test:

'use strict';

(function() {
describe('App', function() {

    describe('TestController', function() {

        beforeEach(function() {
            this.addMatchers({
                toEqualData: function(expected) {
                    return angular.equals(this.actual, expected);
                }
            });
        });

        // Load the controllers module
        beforeEach(module('ratefastApp'));

        // Initialize the controller and a mock scope
        var TestController,
            mockUserResource,
            scope,
            $httpBackend,
            $routeParams,
            $location;

        // The injector ignores leading and trailing underscores here (i.e. _$httpBackend_).
        // This allows us to inject a service but then attach it to a variable
        // with the same name as the service.

        beforeEach(
            inject(function($controller, $rootScope, _$location_, _$routeParams_, _$httpBackend_) {
            scope = $rootScope.$new();
            TestController = $controller('TestController', {
                $scope: scope
            });
            $routeParams = _$routeParams_;
            $httpBackend = _$httpBackend_;
            $httpBackend.when('GET', '/api/test/page/:pagenum')
                .respond([{title: 'test'}]);
            $location = _$location_;

        }));
    });
});
});

En exécutant ce qui précède, je reçois $injector:nomod Module is not available.

22
sergioramosiker

Le ou les modules doivent être chargés dans vos fichiers karma avant le reste de l'application.

Cela est dû au fait que "L'appel à angular.module sans le tableau de dépendances alors que le module n'a pas encore été défini provoque le déclenchement de cette erreur" docs.angularjs.org . Par conséquent, vous devez explicitement charger les fichiers avant le reste de votre application.

Dans vos fichiers javascript Karma.config:

    'app/bower_components/jquery/jquery.js',
    'app/bower_components/angular/angular.js',
    'app/bower_components/angular-mocks/angular-mocks.js',
    'app/bower_components/angular-cookies/angular-cookies.js',
    'app/bower_components/angular-resource/angular-resource.js',
    'app/bower_components/angular-route/angular-route.js',
    'app/bower_components/angular-sanitize/angular-sanitize.js',
    'app/bower_components/angular-scenario/angular-scenario.js',

    'app/scripts/app.js',        // Load your module before the rest of your app.

    'app/scripts/controllers/*.js',
    'app/scripts/directives/*.js',
    'app/scripts/services/*.js',
    'lib/routes.js',           
    'test/karma/unit/**/test.spec.js' 
48
angmerica

Cette erreur indique qu'aucun module n'est trouvé. Plus précisément, le source pour loader.js semble montrer que cette erreur est levée lorsque vous n'avez pas enregistré un module avec angular.module. L'avez-vous fait avec ratefastApp? Voici la source copiée:

    if (!requires) {
      throw $injectorMinErr('nomod', "Module '{0}' 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.", name);
    }  

De plus, puisque vous essayez d'injecter $controller, $rootScope, _$location_, _$routeParams_, _$httpBackend_, avec la maquette $ inject , je commencerais par m'assurer que vous avez les fichiers contenant ces services dans votre directive karma.conf.js files. Vous pouvez également utiliser des caractères génériques pour inclure tous les fichiers angular.

0
ossek