私は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では正常に動作しているようです。このエラーの原因は何ですか?
2016年5月11日更新:回答の非表示エラーを受け入れたという事実についてコメントを書く前に、その受け入れられた特定の回答に対する最初の2つのコメントを参照してください。何をしているのかを知っている場合にのみ使用してください。関連情報: https://github.com/karma-runner/gulp-karma/pull/15
Gulpでどのようにテストを実行していますか?最近、OSXでノードv0.11.14
およびgulp 3.8.10
、失敗したテストがあったときはいつでも。
推奨からの変更:
gulp.task('test', function(done) {
karma.start({
configFile: __dirname + '/karma.conf.js',
singleRun: true
}, done);
});
に:
gulp.task('test', function(done) {
karma.start({
configFile: __dirname + '/karma.conf.js',
singleRun: true
}, function() {
done();
});
});
...このエラーを取り除きました。
コールバックでエラーが通知されたときにgulpがエラーメッセージを処理する方法に依存しているようです。詳細については、 終了時のエラーメッセージの改善 を参照してください。
Gulp 3.9.1とkarma 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();
});
以下は、Karmaの使用に関するgulpパターンのコードスニペットです。少し似ていますが、新しい方法を使用してカルマを開始します。
/**
* 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();
}
}
}
私のために働いて、ナイス形式のエラーメッセージを出したのは、done
コールバックにErrorインスタンスを提供することです。
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();
});
});
エラーコードを返したい場合、Kalpの(おそらく無関係の)スタックトレースではなくKarmaのエラー出力を表示する場合:
gulp.task('test', function() {
karma.start({
configFile: __dirname + '/karma.conf.js',
singleRun: true
}, function(karmaExitStatus) {
if (karmaExitStatus) {
process.exit(1);
}
});
});
これは、テストが失敗し、カルマが1の戻りコードで終了したことを通知するgulpの方法です。
Ubuntuについてはわかりませんが、Windowsでも同様のエラーが発生していました。1つのバージョンをインストールするとすぐに修正されました:
npm install -g [email protected]
npm install [email protected]
gulp.task('test', function(done) {
karma.start({
configFile: __dirname + '/karma.conf.js',
singleRun: false
}, done);
});
singleRun: false
引数を渡すと、プロセスが0以外の値を返すことを防ぎます(エラーを意味し、gulpを終了します)。
連続統合スイートの一部ではなく、コマンドラインからのみテストを起動する場合は、singleRun: true
で実行します。
Karmaのドキュメントと https://github.com/pkozlowski-opensource に従ってこれを解決する正しい方法は、GulpではなくKarmaの監視メカニズムに依存することです。
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 およびその他の関連する問題を参照してください。