从gulp发出运行业力任务

时间:2014-10-28 17:29:48

标签: node.js gulp karma-runner

我正在尝试从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日更新:在撰写有关已接受答案隐藏错误的事实的评论之前,请参阅该特定接受答案的前两条评论。只有知道自己在做什么才能使用它。相关信息:https://github.com/karma-runner/gulp-karma/pull/15

10 个答案:

答案 0 :(得分:130)

你是如何使用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在回调中发出错误信号时如何处理错误消息。有关详细信息,请参阅Improve error messages on exit

答案 1 :(得分:9)

使用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();
});

答案 2 :(得分:5)

以下是使用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();
        }
    }
}

答案 3 :(得分:5)

对我有用并给出了一个很好的格式化错误消息是为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();
    });
});

答案 4 :(得分:2)

如果你想返回错误代码,并希望看到Karma的错误输出而不是Gulp(可能是无关的)堆栈跟踪:

gulp.task('test', function() {
    karma.start({
        configFile: __dirname + '/karma.conf.js',
        singleRun: true
    }, function(karmaExitStatus) {
           if (karmaExitStatus) {
               process.exit(1);
           }
    });
});

答案 5 :(得分:1)

不确定Ubuntu,但我在Windows上遇到了类似的错误,安装了一个版本,然后立即修复它:

npm install -g gulp@3.8.8
npm install gulp@3.8.8

答案 6 :(得分:1)

这是告诉你的测试失败的方法,并且返回代码为1的业力退出。为什么你想要自己调用完成而不是传递错误,因为消息让我感到困惑。

答案 7 :(得分:0)

根据Karma的文档和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以及其他十几个相关问题。

答案 8 :(得分:0)

gulp.task('test', function(done) {
    karma.start({
        configFile: __dirname + '/karma.conf.js',
        singleRun: false 
    }, done);
});

传递singleRun: false参数将阻止进程返回不同于0的值(这将表示错误并退出gulp)。

如果只从命令行启动测试,则运行singleRun: true,而不是持续集成套件的一部分。

答案 9 :(得分:0)

如果有其他人来这里,请不要使用已接受的解决方案。它会隐藏失败的测试。如果您需要快速解决方案来修改gulp测试任务,可以使用comment github线程中this中的解决方案。

gulp.src(src)
    // pipeline...
    .on('error', function (error) {
        console.error('' + error);
    });