【问题标题】:Issue running karma task from gulp从 gulp 发出运行业力任务
【发布时间】:2014-12-24 05:39:32
【问题描述】:

我正在尝试从 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(不确定是什么版本)和 mac os 上,我在 Ubuntu 12.04 LTS 上遇到了同样的错误,它似乎工作正常。什么可能导致此错误?

2016 年 5 月 11 日更新:在撰写有关已接受答案隐藏错误这一事实的评论之前,请先查看该特定已接受答案的前两个 cmets。只有在知道自己在做什么的情况下才使用它。相关信息:https://github.com/karma-runner/gulp-karma/pull/15

【问题讨论】:

    标签: node.js gulp karma-runner


    【解决方案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);
    });
    

    收件人:

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

    ...摆脱了这个错误。

    似乎取决于在回调中发出错误信号时 gulp 如何处理错误消息。请参阅Improve error messages on exit 了解更多信息。

    【讨论】:

    • 有趣的解决方案。所以这似乎不是问题,而是 gulp 中的错误处理和处理不正确。您的解决方案有一个缺点:gulp 本身不会报告任何错误,如果发生错误,您必须查看日志。但对我来说这是可以接受的。谢谢
    • 谢谢,尽管根据链接,您可以执行 function(exitStatus) { done(exitStatus ? "There are failing unit tests" : undefined); } 之类的操作将错误传递回 Gulp - 我没有这样做,因为 Karma 报告机制对我来说工作正常。
    • 我真的不知道这如何解决任何问题......完全没有。首先,done 回调需要一个退出状态。如果选择不提供(作为对未知问题的修复),您的测试任务将毫无意义:您的 测试可能会失败,但您的 gulp 任务不会退出,它将运行其他任务 好像你的测试已经通过了。我的观点是,即使这是一个解决方案,它根本解决不了任何问题!更好的解决方案是禁用测试:)
    • 这是非常不正确且具有误导性的答案:进行此更改意味着如果发生错误,gulp 不会以正确的退出代码退出,而是会以 0 退出,表示失败进程的正确退出代码。这可能会破坏 CI 服务器上的内容、命令链接等。不要这样做。
    • 请参阅:github.com/ONE-LOGIC/gulp-modular-karma/commit/…,了解不会破坏退出代码的工作解决方案
    【解决方案2】:

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

    【讨论】:

    • 对我来说最好的解决方案,虽然它有一个额外的依赖。但是,如果测试失败并且最终没有堆栈跟踪,则运行失败。
    【解决方案3】:

    下面是使用 Karma 的 gulp 模式的代码 sn-p。有点类似,不过也是用较新的方法来启动业力。

    /**
     * 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();
            }
        }
    }
    

    【讨论】:

    • config 未定义
    • 嗨,它只是定义要排除的文件列表。 config.serverIntegrationSpecs = ['*/.spec.js']
    【解决方案4】:

    对我有用并提供格式良好的错误消息的方法是为 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();
        });
    });
    

    【讨论】:

    • 虽然它更短,但它仍然为我创建了一个 StackTrace。而且这个没有额外的 deps(请参阅 gulp-util 解决方案,但它不会创建堆栈跟踪)。
    【解决方案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 gulp@3.8.8
      npm install gulp@3.8.8
      

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          根据 Karma 的文档和https://github.com/pkozlowski-opensource,解决此问题的正确方法是依靠 Karma 的手表机制而不是 Gulp 的:

          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 中的 this github 线程中找到的解决方案。

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-08-05
                • 2020-07-30
                • 2017-04-12
                • 2017-03-13
                • 2016-02-12
                • 1970-01-01
                相关资源
                最近更新 更多