Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

generator-angular: task "karma" not found when calling `grunt test`

I'm trying to setup a development environment with Yeoman for AngularJS, I installed Yeoman according to the instructions: sudo npm install -g yo bower grunt-cli generator-angular and I'm generating a new app with yo angular.

After the app is generated, running karma start does start the karma server, but running grunt test result in

Loading "grunt-karma.js" tasks...ERROR >> TypeError: object is not a function Warning: Task "karma" not found. Use --force to continue.  Aborted due to warnings. 

how do I fix this ?

EDIT: some files (generated fresh from Yeoman)

Gruntfile.js:

'use strict'; var lrSnippet = require('grunt-contrib-livereload/lib/utils').livereloadSnippet; var mountFolder = function (connect, dir) {   return connect.static(require('path').resolve(dir)); };  module.exports = function (grunt) {   // load all grunt tasks   require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks);    // configurable paths   var yeomanConfig = {     app: 'app',     dist: 'dist'   };    try {     yeomanConfig.app = require('./component.json').appPath || yeomanConfig.app;   } catch (e) {}    grunt.initConfig({     yeoman: yeomanConfig,     watch: {       coffee: {         files: ['<%= yeoman.app %>/scripts/{,*/}*.coffee'],         tasks: ['coffee:dist']       },       coffeeTest: {         files: ['test/spec/{,*/}*.coffee'],         tasks: ['coffee:test']       },       compass: {         files: ['<%= yeoman.app %>/styles/{,*/}*.{scss,sass}'],         tasks: ['compass']       },       livereload: {         files: [           '<%= yeoman.app %>/{,*/}*.html',           '{.tmp,<%= yeoman.app %>}/styles/{,*/}*.css',           '{.tmp,<%= yeoman.app %>}/scripts/{,*/}*.js',           '<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'         ],         tasks: ['livereload']       }     },     connect: {       options: {         port: 9000,         // Change this to '0.0.0.0' to access the server from outside.         hostname: 'localhost'       },       livereload: {         options: {           middleware: function (connect) {             return [               lrSnippet,               mountFolder(connect, '.tmp'),               mountFolder(connect, yeomanConfig.app)             ];           }         }       },       test: {         options: {           middleware: function (connect) {             return [               mountFolder(connect, '.tmp'),               mountFolder(connect, 'test')             ];           }         }       }     },     open: {       server: {         url: 'http://localhost:<%= connect.options.port %>'       }     },     clean: {       dist: {         files: [{           dot: true,           src: [             '.tmp',             '<%= yeoman.dist %>/*',             '!<%= yeoman.dist %>/.git*'           ]         }]       },       server: '.tmp'     },     jshint: {       options: {         jshintrc: '.jshintrc'       },       all: [         'Gruntfile.js',         '<%= yeoman.app %>/scripts/{,*/}*.js'       ]     },     karma: {       unit: {         configFile: 'karma.conf.js',         singleRun: true       }     },     coffee: {       dist: {         files: [{           expand: true,           cwd: '<%= yeoman.app %>/scripts',           src: '{,*/}*.coffee',           dest: '.tmp/scripts',           ext: '.js'         }]       },       test: {         files: [{           expand: true,           cwd: 'test/spec',           src: '{,*/}*.coffee',           dest: '.tmp/spec',           ext: '.js'         }]       }     },     compass: {       options: {         sassDir: '<%= yeoman.app %>/styles',         cssDir: '.tmp/styles',         imagesDir: '<%= yeoman.app %>/images',         javascriptsDir: '<%= yeoman.app %>/scripts',         fontsDir: '<%= yeoman.app %>/styles/fonts',         importPath: '<%= yeoman.app %>/components',         relativeAssets: true       },       dist: {},       server: {         options: {           debugInfo: true         }       }     },     concat: {       dist: {         files: {           '<%= yeoman.dist %>/scripts/scripts.js': [             '.tmp/scripts/{,*/}*.js',             '<%= yeoman.app %>/scripts/{,*/}*.js'           ]         }       }     },     useminPrepare: {       html: '<%= yeoman.app %>/index.html',       options: {         dest: '<%= yeoman.dist %>'       }     },     usemin: {       html: ['<%= yeoman.dist %>/{,*/}*.html'],       css: ['<%= yeoman.dist %>/styles/{,*/}*.css'],       options: {         dirs: ['<%= yeoman.dist %>']       }     },     imagemin: {       dist: {         files: [{           expand: true,           cwd: '<%= yeoman.app %>/images',           src: '{,*/}*.{png,jpg,jpeg}',           dest: '<%= yeoman.dist %>/images'         }]       }     },     cssmin: {       dist: {         files: {           '<%= yeoman.dist %>/styles/main.css': [             '.tmp/styles/{,*/}*.css',             '<%= yeoman.app %>/styles/{,*/}*.css'           ]         }       }     },     htmlmin: {       dist: {         options: {           /*removeCommentsFromCDATA: true,           // https://github.com/yeoman/grunt-usemin/issues/44           //collapseWhitespace: true,           collapseBooleanAttributes: true,           removeAttributeQuotes: true,           removeRedundantAttributes: true,           useShortDoctype: true,           removeEmptyAttributes: true,           removeOptionalTags: true*/         },         files: [{           expand: true,           cwd: '<%= yeoman.app %>',           src: ['*.html', 'views/*.html'],           dest: '<%= yeoman.dist %>'         }]       }     },     cdnify: {       dist: {         html: ['<%= yeoman.dist %>/*.html']       }     },     ngmin: {       dist: {         files: [{           expand: true,           cwd: '<%= yeoman.dist %>/scripts',           src: '*.js',           dest: '<%= yeoman.dist %>/scripts'         }]       }     },     uglify: {       dist: {         files: {           '<%= yeoman.dist %>/scripts/scripts.js': [             '<%= yeoman.dist %>/scripts/scripts.js'           ]         }       }     },     rev: {       dist: {         files: {           src: [             '<%= yeoman.dist %>/scripts/{,*/}*.js',             '<%= yeoman.dist %>/styles/{,*/}*.css',             '<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}',             '<%= yeoman.dist %>/styles/fonts/*'           ]         }       }     },     copy: {       dist: {         files: [{           expand: true,           dot: true,           cwd: '<%= yeoman.app %>',           dest: '<%= yeoman.dist %>',           src: [             '*.{ico,txt}',             '.htaccess',             'components/**/*',             'images/{,*/}*.{gif,webp}',             'styles/fonts/*'           ]         }]       }     }   });    grunt.renameTask('regarde', 'watch');    grunt.registerTask('server', [     'clean:server',     'coffee:dist',     'compass:server',     'livereload-start',     'connect:livereload',     'open',     'watch'   ]);    grunt.registerTask('test', [     'clean:server',     'coffee',     'compass',     'connect:test',     'karma'   ]);    grunt.registerTask('build', [     'clean:dist',     'jshint',     'test',     'coffee',     'compass:dist',     'useminPrepare',     'imagemin',     'cssmin',     'htmlmin',     'concat',     'copy',     'cdnify',     'ngmin',     'uglify',     'rev',     'usemin'   ]);    grunt.registerTask('default', ['build']); }; 

karma.conf.js:

// Karma configuration  // base path, that will be used to resolve files and exclude basePath = '';  // list of files / patterns to load in the browser files = [   JASMINE,   JASMINE_ADAPTER,   'app/components/angular/angular.js',   'app/components/angular-mocks/angular-mocks.js',   'app/scripts/*.js',   'app/scripts/**/*.js',   'test/mock/**/*.js',   'test/spec/**/*.js' ];  // list of files to exclude exclude = [];  // test results reporter to use // possible values: dots || progress || growl reporters = ['progress'];  // web server port port = 8080;  // cli runner port runnerPort = 9100;  // enable / disable colors in the output (reporters and logs) colors = true;  // level of logging // possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG logLevel = LOG_INFO;  // enable / disable watching file and executing tests whenever any file changes autoWatch = false;  // Start these browsers, currently available: // - Chrome // - ChromeCanary // - Firefox // - Opera // - Safari (only Mac) // - PhantomJS // - IE (only Windows) browsers = ['Chrome'];  // If browser does not capture in given timeout [ms], kill it captureTimeout = 5000;  // Continuous Integration mode // if true, it capture browsers, run tests and exit singleRun = false; 

test/spec/controllers/main.js:

'use strict';  describe('Controller: MainCtrl', function () {    // load the controller's module   beforeEach(module('testApp'));    var MainCtrl,     scope;    // Initialize the controller and a mock scope   beforeEach(inject(function ($controller, $rootScope) {     scope = $rootScope.$new();     MainCtrl = $controller('MainCtrl', {       $scope: scope     });   }));    it('should attach a list of awesomeThings to the scope', function () {     expect(scope.awesomeThings.length).toBe(3);   }); });'use strict';  describe('Controller: MainCtrl', function () {    // load the controller's module   beforeEach(module('testApp'));    var MainCtrl,     scope;    // Initialize the controller and a mock scope   beforeEach(inject(function ($controller, $rootScope) {     scope = $rootScope.$new();     MainCtrl = $controller('MainCtrl', {       $scope: scope     });   }));    it('should attach a list of awesomeThings to the scope', function () {     expect(scope.awesomeThings.length).toBe(3);   }); }); 
like image 895
Gal Ben-Haim Avatar asked Jun 26 '13 06:06

Gal Ben-Haim


2 Answers

npm install grunt-karma --save-dev 

or if you need it

sudo npm install grunt-karma --save-dev 

from the docs on https://npmjs.org/package/grunt-karma

like image 91
JamesClevenger Avatar answered Oct 25 '22 11:10

JamesClevenger


after running

npm install grunt-karma --save-dev 

add the following line to Gruntfile.js

grunt.loadNpmTasks('grunt-karma'); 

this works for me.

like image 36
ATilara Avatar answered Oct 25 '22 09:10

ATilara