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
npm install grunt-karma --save-dev
o si lo necesitas
sudo npm install grunt-karma --save-dev
de los documentos en https://npmjs.org/package/grunt-karma