2013-06-26 7 views
39

Próbuję skonfigurować środowisko programistyczne z Yeomanem dla AngularJS, Zainstalowałem Yeoman zgodnie z instrukcjami: sudo npm install -g yo bower grunt-cli generator-angular i generuję nowe aplikacja z yo angular.generator-kątowy: zadanie "karma" nie zostało znalezione podczas wywoływania `teście gruntowym`

Po aplikacji jest generowana, bieganie karma start ma uruchomić serwer karmę, ale działa grunt test wynik w

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. 

jak mogę rozwiązać ten problem?

Edycja: Niektóre formaty (wytwarzane prosto z 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; 

testowe/Widmo/regulatory/główne. 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

można udostępnić swoją Gruntfile, plik testowy, i cokolwiek innego związanego? – Stephen

+0

Dodałem Grunfile.js, karma.conf.js i przykładowy test do pytania, które są generowane świeżo z generatora Yeomana –

+0

@ GalBen-Haim, której wersji Node/npm używasz? Byłem w stanie rozwiązać ten problem przez uaktualnienie mojej wersji węzła. Sprawdź moją odpowiedź, by poznać szczegóły. –

Odpowiedz

88
npm install grunt-karma --save-dev 

lub jeśli jest to potrzebne

sudo npm install grunt-karma --save-dev 

z docs na https://npmjs.org/package/grunt-karma

+2

Muszę także zainstalować karma-phantomjs-launchera i karma-jaśmin: npm install grunt-karma-pha-phantomjs-launcher karma-jaśmin - zapisz-dev – Carlos

+3

Oto, co musiałem dodać: 'npm install grunt-karma karma-phantomjs-launcher-karma-jaśmin jasmine-core phantomjs --save-dev' –

17

po uruchomieniu

npm install grunt-karma --save-dev 

dodać następującą linię do Gruntfile.js

grunt.loadNpmTasks('grunt-karma'); 

to działa dla mnie.

+3

Czy generator kątowy nie powinien być naprawiony, aby uwzględnić to w package.json? – jedmao

+3

lo and behold https://github.com/yeoman/generator-angular/issues/515 – jedmao

+4

Nie musisz dodawać polecenia 'loadNpmTasks', ponieważ umieściłeś je w wywołaniach package.json i Gruntfile.js 'require ('load-grunt-tasks') (grunt);' – Kato

4

Oczywiste odpowiedzi już tutaj zamieszczone były całkowicie nieprzydatne dla mnie. Jeśli ponowna instalacja grunt-karma przez npm nie zadziałała, a jawne wczytanie zadania w pliku Gruntfile nie pomogło, możesz uruchomić wersję npm przed 1.2.10.

Okazuje się, że ostatnie wersje grunt-karma polegają na peer dependencies, które zostały wprowadzone do Węzła z wersją 8.19. Po aktualizacji Nodejs (która również instaluje npm) i ulepszaniu karmy na całym świecie, odkryłem, że muszę również edytować moje pliki konfiguracyjne karmy. Będziesz chciał dodać frameworks: ['jasmine'], do karma.conf.js i usunąć odniesienia do JASMINE i JASMINE_ADAPTER z ustawienia files.

+0

Dziękuję za odpowiedź. Zajęło mi kilka walenie głową w ścianę, twoja odpowiedź uratowała dzień od ściany – mfeingold

1

Wystąpił problem Nie znaleziono.

końcu sobie sprawę, że był problem z portu (8080 była już używana)

w karma.config.js zmienić numer portu:

// web server port 
port: 9999, 
Powiązane problemy