从gulp发出运行业力任务

Tim*_*mur 64 node.js karma-runner 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)
Run Code Online (Sandbox Code Playgroud)

我的系统是Windows 7,nodejs版本是,gulp v0.10.32版本:

[10:26:52] CLI version 3.8.8
[10:26:52] Local version 3.8.9
Run Code Online (Sandbox Code Playgroud)

另外,我Ubuntu 12.04 LTS在更新的Ubuntu(不确定是什么版本)和mac os上遇到的同样的错误似乎工作正常.什么可能导致此错误?

2016年5月11日更新:在写关于接受的答案隐藏错误这一事实的评论之前,请参阅该特定接受答案的前两条评论.只有知道自己在做什么才能使用它.相关信息:https://github.com/karma-runner/gulp-karma/pull/15

McD*_*mon 131

你是如何用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);
});
Run Code Online (Sandbox Code Playgroud)

至:

gulp.task('test', function(done) {
    karma.start({
        configFile: __dirname + '/karma.conf.js',
        singleRun: true
    }, function() {
        done();
    });
});
Run Code Online (Sandbox Code Playgroud)

......摆脱了这个错误.

似乎是当gulp在回调中发出错误信号时如何处理错误消息.有关详细信息,请参阅退出时改进错误消息.

  • 这是非常不正确和误导性的答案:执行此更改意味着在错误的情况下gulp将不会以正确的退出代码退出,而是以0退出,发出正确的退出代码以表示失败的进程.这可能会破坏CI服务器上的内容,链接命令等.不要这样做. (18认同)
  • 我真的不知道这是如何解决任何问题的......总而言之.首先,`done`回调需要退出状态.如果选择不提供一个(作为未知问题的修复),您的测试任务没有任何意义:您的**测试可能会失败**,但您的gulp任务不会退出,它将运行其他任务**就像您的测试已通过**.我的观点是,即使这是一个*解决方案*,它也无法解决任何问题!更好的解决方案是禁用测试:) (6认同)
  • 谢谢,虽然根据链接,你可以做一些像`function(exitStatus){done(exitStatus?"有失败的单元测试":undefined); 将错误传回给Gulp - 我没有,因为Karma报告机制对我来说工作正常. (3认同)
  • 有趣的解决方案.所以这似乎不是一个问题,但不正确的错误处理和gulp处理.您的解决方案有一个缺点:gulp本身不会报告任何错误,如果发生错误,您将不得不查看日志.但对我来说这是可以接受的.谢谢 (2认同)
  • 请参阅:https://github.com/ONE-LOGIC/gulp-modular-karma/commit/62c5df66b50e76de6b3f97a4794c3f574949344c,了解不会破坏退出代码的工作解决方案 (2认同)

bro*_*son 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();
});
Run Code Online (Sandbox Code Playgroud)


Igo*_*ino 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Bla*_*nic 5

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