gruntjs yeoman karma-runner

gruntjs - generator-angular: la tarea "karma" no se encuentra al llamar `prueba de ronco`



yeoman karma-runner (4)

A estaba teniendo el problema de No Encontrado.

Finalmente me doy cuenta de que era un problema con el puerto (el 8080 ya estaba usado)

en karma.config.js cambie el número de puerto:

// web server port port: 9999,

Estoy tratando de configurar un entorno de desarrollo con Yeoman para AngularJS, instalé Yeoman de acuerdo con las instrucciones: sudo npm install -g yo bower grunt-cli generator-angular y estoy generando una nueva aplicación con yo angular .

Después de que se genera la aplicación, la ejecución del karma start inicia el servidor de karma, pero se ejecuta un resultado de grunt test en

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.

Cómo puedo solucionar esto ?

EDITAR: algunos archivos (generados frescos de 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); }); });


Las respuestas obvias ya publicadas aquí fueron completamente inútiles para mí. Si la reinstalación de grunt-karma a través de npm no funcionó, y la carga explícita de la tarea en Gruntfile no ayudó, es posible que esté ejecutando una versión de npm anterior a 1.2.10.

Resulta que las versiones recientes de grunt-karma dependen de las dependencias entre pares , que se introdujeron en Node con la versión 8.19. Después de actualizar Nodejs (que también instala npm) y actualizar el karma globalmente, descubrí que también necesitaba editar mis archivos de configuración de karma. Deberá agregar frameworks: [''jasmine''], a karma.conf.js y eliminar las referencias a JASMINE y JASMINE_ADAPTER de la configuración de files .


despues de correr

npm install grunt-karma --save-dev

agregue la siguiente línea a Gruntfile.js

grunt.loadNpmTasks(''grunt-karma'');

esto funciona para mi