J’essaie d’installer un environnement de développement avec Yeoman pour AngularJS, j’ai installé Yeoman selon les instructions: sudo npm install -g yo bower grunt-cli generator-angular
et je génère une nouvelle application avec yo angular
.
Une fois l’application générée, le karma start
le serveur Karma, mais l’exécution de 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.
Comment puis-je réparer ça ?
EDIT: certains fichiers (générés par Yeoman)
Gruntfile.js:
'use ssortingct'; var lrSnippet = require('grunt-consortingb-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: ['/scripts/{,*/}*.coffee'], tasks: ['coffee:dist'] }, coffeeTest: { files: ['test/spec/{,*/}*.coffee'], tasks: ['coffee:test'] }, compass: { files: ['/styles/{,*/}*.{scss,sass}'], tasks: ['compass'] }, livereload: { files: [ '/{,*/}*.html', '{.tmp,}/styles/{,*/}*.css', '{.tmp,}/scripts/{,*/}*.js', '/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:' } }, clean: { dist: { files: [{ dot: true, src: [ '.tmp', '/*', '!/.git*' ] }] }, server: '.tmp' }, jshint: { options: { jshintrc: '.jshintrc' }, all: [ 'Gruntfile.js', '/scripts/{,*/}*.js' ] }, karma: { unit: { configFile: 'karma.conf.js', singleRun: true } }, coffee: { dist: { files: [{ expand: true, cwd: '/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: '/styles', cssDir: '.tmp/styles', imagesDir: '/images', javascriptsDir: '/scripts', fontsDir: '/styles/fonts', importPath: '/components', relativeAssets: true }, dist: {}, server: { options: { debugInfo: true } } }, concat: { dist: { files: { '/scripts/scripts.js': [ '.tmp/scripts/{,*/}*.js', '/scripts/{,*/}*.js' ] } } }, useminPrepare: { html: '/index.html', options: { dest: '' } }, usemin: { html: ['/{,*/}*.html'], css: ['/styles/{,*/}*.css'], options: { dirs: [''] } }, imagemin: { dist: { files: [{ expand: true, cwd: '/images', src: '{,*/}*.{png,jpg,jpeg}', dest: '/images' }] } }, cssmin: { dist: { files: { '/styles/main.css': [ '.tmp/styles/{,*/}*.css', '/styles/{,*/}*.css' ] } } }, htmlmin: { dist: { options: { /*removeCommentsFromCDATA: true, // https://github.com/yeoman/grunt-usemin/issues/44 //collapseWhitespace: true, collapseBooleanAtsortingbutes: true, removeAtsortingbuteQuotes: true, removeRedundantAtsortingbutes: true, useShortDoctype: true, removeEmptyAtsortingbutes: true, removeOptionalTags: true*/ }, files: [{ expand: true, cwd: '', src: ['*.html', 'views/*.html'], dest: '' }] } }, cdnify: { dist: { html: ['/*.html'] } }, ngmin: { dist: { files: [{ expand: true, cwd: '/scripts', src: '*.js', dest: '/scripts' }] } }, uglify: { dist: { files: { '/scripts/scripts.js': [ '/scripts/scripts.js' ] } } }, rev: { dist: { files: { src: [ '/scripts/{,*/}*.js', '/styles/{,*/}*.css', '/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}', '/styles/fonts/*' ] } } }, copy: { dist: { files: [{ expand: true, dot: true, cwd: '', dest: '', 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 ssortingct'; 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 ssortingct'; 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); }); });
npm install grunt-karma --save-dev
ou si vous en avez besoin
sudo npm install grunt-karma --save-dev
des documents sur https://npmjs.org/package/grunt-karma
après avoir couru
npm install grunt-karma --save-dev
Ajoutez la ligne suivante à Gruntfile.js
grunt.loadNpmTasks('grunt-karma');
cela fonctionne pour moi.
Les réponses évidentes déjà affichées ici étaient totalement inutiles. Si la réinstallation de grunt-karma via npm n’a pas fonctionné et que le chargement explicite de la tâche dans le Gruntfile n’a pas aidé, vous pouvez lancer une version de npm antérieure à 1.2.10.
Il s’avère que les versions récentes de grunt-karma reposent sur des dépendances homologues , qui ont été introduites dans Node avec la version 8.19. Après la mise à niveau de Nodejs (qui installe également npm) et la mise à niveau globale de karma, j’ai découvert que je devais également éditer mes fichiers de configuration de karma. Vous voudrez append des frameworks: ['jasminee'],
à karma.conf.js
et supprimer les références à JASMINE
et JASMINE_ADAPTER
du paramètre files
.
A avait le problème de non trouvé.
Enfin je me rends compte que c’était un problème avec le port (8080 était déjà utilisé)
dans karma.config.js modifiez le numéro de port:
// web server port port: 9999,