Выпуск запуск карма задача из глотка


Я пытаюсь запустить тесты кармы из задачи gulp, и я получаю эту ошибку:

Error: 1
   at formatError (C:UsersTimAppDataRoamingnpmnode_modulesgulpbingulp.js:161:10)
   at Gulp.<anonymous> (C:UsersTimAppDataRoamingnpmnode_modulesgulpbingulp.js:187:15)
   at Gulp.emit (events.js:95:17)
   at Gulp.Orchestrator._emitTaskDone (C:pathtoprojectnode_modulesgulpnode_modulesorchestratorindex.js:264:8)
   at C:pathtoprojectnode_modulesgulpnode_modulesorchestratorindex.js:275:23
   at finish (C:pathtoprojectnode_modulesgulpnode_modulesorchestratorlibrunTask.js:21:8)
   at cb (C:pathtoprojectnode_modulesgulpnode_modulesorchestratorlibrunTask.js:29:3)
   at removeAllListeners (C:pathtoprojectnode_moduleskarmalibserver.js:216:7)
   at Server.<anonymous> (C:pathtoprojectnode_moduleskarmalibserver.js:227:9)
   at Server.g (events.js:180:16)

моя система Windows 7, nodejs версия v0.10.32 - хрум версия:

[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

10 64

10 ответов:

как вы проводите свои тесты с Gulp? Недавно я столкнулся с этой проблемой на OSX, запустив node v0.11.14 и залпом 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 обрабатывает сообщения об ошибках, когда ошибка сигнализируется в обратном вызове. Смотрите улучшить сообщения об ошибках на выходе дополнительные информация.

ни одно из этих решений не работало правильно для меня, используя 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();
});

Ниже приведен фрагмент кода из шаблонов 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();
        }
    }
}

то, что работало для меня и дало хорошее отформатированное сообщение об ошибке, - это предоставить экземпляр ошибки 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();
    });
});

Если вы хотите вернуться с кодом ошибки и хотите увидеть вывод ошибок Karma, но не трассировку стека Gulp (вероятно, не связанную):

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

Не уверен в Ubuntu, но я получал аналогичную ошибку в Windows, и установка одной версии обратно исправила ее сразу так:

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

Это способ gulp сказать, что ваши тесты потерпели неудачу, и что карма вышла с кодом возврата 1. Почему вы хотите позвонить сами и не передать ошибку, поскольку сообщение озадачивает меня.

правильный способ решить эту проблему в соответствии с документацией кармы и https://github.com/pkozlowski-opensource, полагаться на часовой механизм кармы, а не на глоток:

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 и еще около десятка связанных с этим вопросов.

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

передает singleRun: false аргумент не позволит процессу возвращать значение, отличное от 0 (что будет означать ошибку и выход из gulp).

запустить с singleRun: true Если вы запускаете тест только из командной строки, а не из пакета непрерывной интеграции.

в случае, если кто-то еще придет сюда, не используйте принятое решение. Он скроет неудачные тесты. Если вам нужно быстрое решение для изменения тестовой задачи gulp, вы можете использовать решение, найденное в этом комментарий на этой поток github.

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