2015-03-05 2 views
4

У меня есть небольшой единичный тест в Jasmine, который работает с кармой. Но когда я запускаю Карму это показывает ошибку:

Uncaught Error: [$injector:nomod] Module 'material.controllers' 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.

FAILED Unit: LoginController encountered a declaration exception

ReferenceError: module is not defined

Вот мой исходный код, конфигурационный файл Карма и UnitTest.

karma.conf.js

module.exports = function(config) { 
    config.set({ 

    // base path that will be used to resolve all patterns (eg. files, exclude) 
    basePath: '', 


    // frameworks to use 
    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter 
    frameworks: ['jasmine'], 


    // list of files/patterns to load in the browser 
    files: [ 
     '/home/tanpham/Angular/Dev/libs/angular/angular.js', 
     '/home/tanpham/Angular/Dev/js/**/*.js', 
     '/home/tanpham/Angular/Dev/js/*.js', 
     '/home/tanpham/Angular/Test/*.js' 
    ], 


    // list of files to exclude 
    exclude: [ 
    ], 


    // preprocess matching files before serving them to the browser 
    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor 
    preprocessors: { 
    }, 

index.html

<body ng-app="material" ng-controller="AppController"> 
    <ui-view></ui-view> 
</body> 

app.js

angular.module('material.controllers', []); 
angular.module('material.services', []); 
angular.module('material.directives',[]); 
angular.module('material.filters',[]); 
var app = angular.module('material', ['ui.router','material.directives','http-auth-interceptor','material.controllers','material.services','material.filters']) 
.config(function($stateProvider, $urlRouterProvider,$locationProvider) { 
    $stateProvider 
    .state('app', { 
     url: "/app", 
     abstract: true, 
     templateUrl: "views/app.html" 
    }).state('login', { 
     url: "/login", 
     templateUrl: "views/login.html", 
     controller: "LoginController" 
    }); 

    $urlRouterProvider.otherwise('/login'); 
}) 

LoginController

angular.module('material.controllers').controller('LoginController', function($scope) { 

     $scope.name = "Ari"; 
     $scope.sayHello = function() { 
     $scope.greeting = "Hello " + $scope.name; 
     } 
}); 

helloSpec.js

describe('Unit: LoginController', function() { 

     // Load the module with LoginController 
     beforeEach(module('material.controllers')); 

     var ctrl, scope; 
     // inject the $controller and $rootScope services 
     // in the beforeEach block 
     beforeEach(inject(function($controller, $rootScope) { 
     // Create a new scope that's a child of the $rootScope 
     scope = $rootScope.$new(); 
     // Create the controller 
     ctrl = $controller('LoginController', { 
      $scope: scope 
     }); 
     })); 

     it('should create $scope.greeting when calling sayHello', 
     function() { 
      expect(scope.greeting).toBeUndefined(); 
      scope.sayHello(); 
      expect(scope.greeting).toEqual("Hello Ari"); 
     }); 

}) 

Таким образом, я могу сделать с этим, и имя моего модуля правильно?

ответ

8

Проверьте порядок загрузки угловых модулей. Как ваш список файлов javascript в karma conf, посмотрите, загружены ли файлы, определенные модулем, перед другими файлами, которые его используют.

Отредактируйте заказ в этом листинге, явно загрузите файл, в котором определен модуль «material.controllers».

files: [ 
    '/home/tanpham/Angular/Dev/libs/angular/angular.js', 
    '/home/tanpham/Angular/Dev/js/**/*.js', 
    '/home/tanpham/Angular/Dev/js/*.js', 
    '/home/tanpham/Angular/Test/*.js' 
], 
+0

Большое вам спасибо за ваш комментарий. В приведенном выше примере порядок должен быть '' /home/tanpham/Angular/Dev/js/*.js ', '/home/tanpham/Angular/Dev/js/**/*. Js ', 'then все это должно снова работать. –

1

Я встретил эту проблему. и решил это. . просто добавить «[]» за имя модуля в операторе модуля объявляют в этом случае chaged код будет:

angular.module('material.controllers',[]) 
.controller('LoginController', function($scope) { 

    $scope.name = "Ari"; 
    $scope.sayHello = function() { 
    $scope.greeting = "Hello " + $scope.name; 
    } 
}); 
+0

Это была моя проблема, поэтому спасибо за ответ. Однако, как это ни парадоксально, на самом деле это не отвечает на вопрос, который OP продемонстрировал в его ситуации, но помог мне в методе, который я использовал для загрузки модулей. – Mark

Смежные вопросы