2013-06-26 53 views
39

我試圖爲Yeoman設置一個開發環境,用於AngularJS, 我按照說明安裝了Yeoman:sudo npm install -g yo bower grunt-cli generator-angular並且我正在生成一個新的應用程序yo angulargenerator-angular:調用`grunt test`時未找到任務「karma」

應用產生後,運行karma start並啓動因緣服務器,但運行grunt test結果

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. 

我該如何解決這個問題?

編輯:某些文件(從約曼產生新鮮)

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; 

測試/規格/控制器/主。 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); 
    }); 
}); 
+0

你可以分享你的Gruntfile,測試文件,和其他相關的東西? – Stephen

+0

我添加了Grunfile.js,karma.conf.js和一個測試示例到問題中,這些都是從Yeoman生成器新鮮生成的 –

+0

@ GalBen-Haim哪個版本的Node/npm正在運行?我能夠通過升級我的節點版本來解決此問題。查看我的答案以獲取詳細信息。 –

回答

88
npm install grunt-karma --save-dev 

,或者如果你需要它

sudo npm install grunt-karma --save-dev 
從文檔

https://npmjs.org/package/grunt-karma

+2

另外我得安裝karma-phantomjs-launcher和karma-jasmine:npm install grunt-karma karma-phantomjs-launcher karma -jasmine --save-dev – Carlos

+3

這就是我不得不補充的:'npm install grunt-karma karma karma-phantomjs-launcher karma-jasmine jasmine-core phantomjs --save-dev' –

17

運行

npm install grunt-karma --save-dev 

後添加以下行來Gruntfile.js

grunt.loadNpmTasks('grunt-karma'); 

這個作品爲了我。

+3

不應該將角度發生器固定在package.json中嗎? – jedmao

+3

瞧!https://github.com/yeoman/generator-angular/issues/515 – jedmao

+4

你不需要添加'loadNpmTasks'命令,因爲你已經把它放到package.json和Gruntfile.js調用中'require('load-grunt-tasks')(grunt);' – Kato

4

已經發布在這裏的明顯答案對我完全沒有幫助。如果通過npm重新安裝grunt-karma不起作用,並且明確地將任務加載到Gruntfile中並沒有幫助,那麼您可能會在1.2.10之前運行一個npm版本。

事實證明,grunt-karma的最新版本依賴於peer dependencies,它們被引入到版本爲8.19的Node中。在升級Nodejs(也安裝npm)和全球升級karma之後,我發現我也需要編輯我的karma配置文件。您需要將frameworks: ['jasmine'],添加到karma.conf.js,並從files設置中刪除對JASMINEJASMINE_ADAPTER的引用。

+0

謝謝你的回答。我用頭撞牆,把你的答案拯救了一天 – mfeingold

1

A有一個未找到的問題。

最後,我意識到這是用的端口有問題(8080已使用)

在karma.config.js更改端口號:

// web server port 
port: 9999,