Проблема с выполнением задачи кармы с gulp
Я пытаюсь запустить тесты кармы из задачи gulp, и я получаю эту ошибку:
Error: 1
at formatError (C:\Users\Tim\AppData\Roaming\npm\node_modules\gulp\bin\gulp.js:161:10)
at Gulp.<anonymous> (C:\Users\Tim\AppData\Roaming\npm\node_modules\gulp\bin\gulp.js:187:15)
at Gulp.emit (events.js:95:17)
at Gulp.Orchestrator._emitTaskDone (C:\path\to\project\node_modules\gulp\node_modules\orchestrator\index.js:264:8)
at C:\path\to\project\node_modules\gulp\node_modules\orchestrator\index.js:275:23
at finish (C:\path\to\project\node_modules\gulp\node_modules\orchestrator\lib\runTask.js:21:8)
at cb (C:\path\to\project\node_modules\gulp\node_modules\orchestrator\lib\runTask.js:29:3)
at removeAllListeners (C:\path\to\project\node_modules\karma\lib\server.js:216:7)
at Server.<anonymous> (C:\path\to\project\node_modules\karma\lib\server.js:227:9)
at Server.g (events.js:180:16)
Моя система Windows 7
, версия nodejs v0.10.32
, gulp версия:
[10:26:52] CLI version 3.8.8
[10:26:52] Local version 3.8.9
Кроме того, ту же ошибку, с которой я нахожусь Ubuntu 12.04 LTS
, на более позднем Ubuntu (не уверен, какая версия) и mac os, похоже, работает нормально. Что может вызвать эту ошибку?
Обновление 5/11/2016. Прежде чем писать комментарий о том, что принятый ответ скрывает ошибки, пожалуйста, посмотрите первые два комментария на этот принятый ответ. Используйте его, только если знаете, что делаете. Связанная информация: https://github.com/karma-runner/gulp-karma/pull/15
Ответы
Ответ 1
Как вы проводите тесты с помощью Gulp? Недавно я столкнулся с этой проблемой в OSX, запустив node v0.11.14
и gulp 3.8.10
, когда были неудачные тесты.
Переход от рекомендуемого:
gulp.task('test', function(done) {
karma.start({
configFile: __dirname + '/karma.conf.js',
singleRun: true
}, done);
});
To:
gulp.task('test', function(done) {
karma.start({
configFile: __dirname + '/karma.conf.js',
singleRun: true
}, function() {
done();
});
});
... избавился от этой ошибки.
Похоже на то, что gulp обрабатывает сообщения об ошибках, когда ошибка обращается в обратном вызове. Подробнее см. Улучшить сообщения об ошибках при выходе.
Ответ 2
Ни одно из этих решений не работало корректно для меня, используя gulp 3.9.1 и карму 1.1.1. Добавив ссылку на gulp -util npm install --save-dev gulp-util
и обновив задачу до нижнего уровня, исправьте вывод ошибки очень хорошо, сохраняя при этом правильное состояние выхода.
var gutil = require('gulp-util');
gulp.task('test', function (done) {
new Server({
configFile: __dirname + '/karma.conf.js',
singleRun: true
}, function(err){
if(err === 0){
done();
} else {
done(new gutil.PluginError('karma', {
message: 'Karma Tests failed'
}));
}
}).start();
});
Ответ 3
Ниже приведен фрагмент кода из шаблонов gulp при использовании Karma. Это немного похоже, но также использует более новый метод, как начать карму.
/**
* Start the tests using karma.
* @param {boolean} singleRun - True means run once and end (CI), or keep running (dev)
* @param {Function} done - Callback to fire when karma is done
* @return {undefined}
*/
function startTests(singleRun, done) {
var child;
var excludeFiles = [];
var fork = require('child_process').fork;
var KarmaServer = require('karma').Server;
var serverSpecs = config.serverIntegrationSpecs;
if (args.startServers) {
log('Starting servers');
var savedEnv = process.env;
savedEnv.NODE_ENV = 'dev';
savedEnv.PORT = 8888;
child = fork(config.nodeServer);
} else {
if (serverSpecs && serverSpecs.length) {
excludeFiles = serverSpecs;
}
}
var server = new KarmaServer({
configFile: __dirname + '/karma.conf.js',
exclude: excludeFiles,
singleRun: singleRun
}, karmaCompleted);
server.start();
////////////////
function karmaCompleted(karmaResult) {
log('Karma completed');
if (child) {
log('shutting down the child process');
child.kill();
}
if (karmaResult === 1) {
done('karma: tests failed with code ' + karmaResult);
} else {
done();
}
}
}
Ответ 4
Что сработало для меня и дало хорошее отформатированное сообщение об ошибке - предоставить экземпляр Error для обратного вызова done
.
gulp.task('test', function(done) {
karma.start({
configFile: __dirname + '/karma.conf.js',
singleRun: true
}, function(result) {
if (result > 0) {
return done(new Error(`Karma exited with status code ${result}`));
}
done();
});
});
Ответ 5
Если вы хотите вернуться с кодом ошибки и хотите увидеть вывод ошибки Karma, но не Gulp (возможно, несвязанный) трассировка стека:
gulp.task('test', function() {
karma.start({
configFile: __dirname + '/karma.conf.js',
singleRun: true
}, function(karmaExitStatus) {
if (karmaExitStatus) {
process.exit(1);
}
});
});
Ответ 6
Не уверен в Ubuntu, но я получал аналогичную ошибку в Windows, и установка одной версии обратно исправлена сразу:
npm install -g [email protected]
npm install [email protected]
Ответ 7
это gulp способ сообщить, что ваши тесты потерпели неудачу, и что карма вышла с кодом возврата 1. Почему вы хотели бы позвонить сами и не передавать ошибку, поскольку сообщение меня озадачивает.
Ответ 8
Правильный способ решения этой проблемы в соответствии с документацией по карме и https://github.com/pkozlowski-opensource состоит в том, чтобы полагаться на механизм часов Karma, а не Gulp s:
gulp.task('tdd', function (done) {
karma.start({
configFile: __dirname + '/karma.conf.js'
}, done);
});
Обратите внимание на упущение singleRun: true
.
@McDamon будет работать для gulp.watch
, но вы не хотите проглатывать коды выхода, подобные этому при запуске на сервере CI.
Gulp также перерабатывает то, как они обрабатывают коды выхода в сценариях так же, как этот. См. https://github.com/gulpjs/gulp/issues/71 и другие дюжины связанных проблем.
Ответ 9
gulp.task('test', function(done) {
karma.start({
configFile: __dirname + '/karma.conf.js',
singleRun: false
}, done);
});
Передача аргумента singleRun: false
не даст процессу вернуть значение, отличное от 0 (что означало бы ошибку и выход из gulp).
Запустите с помощью singleRun: true
, если вы запускаете тест только из командной строки, а не из пакета непрерывной интеграции.
Ответ 10
Если кто-то еще сюда придет, не используйте принятое решение. Он скроет неудачные тесты. Если вам нужно быстрое решение для изменения тестовой задачи gulp, вы можете использовать решение, найденное в этом comment в этот поток github.
gulp.src(src)
// pipeline...
.on('error', function (error) {
console.error('' + error);
});