Проблема с выполнением задачи кармы с 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)

Моя система 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, похоже, работает нормально. Что может вызвать эту ошибку?

Обновление 5/11/2016. Прежде чем писать комментарий о том, что принятый ответ скрывает ошибки, пожалуйста, посмотрите первые два комментария на этот принятый ответ. Используйте его, только если знаете, что делаете. Связанная информация: https://github.com/karma-runner/gulp-karma/pull/15

Ответ 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);
});

To:

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

... избавился от этой ошибки.

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

Ответ 2

Ни одно из этих решений не работало корректно для меня, используя gulp 3.9.1 и карму 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

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

Ответ 4

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

Ответ 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 [email protected]
npm install [email protected]

Ответ 7

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

Ответ 8

Правильный способ решения этой проблемы в соответствии с документацией по карме и 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 и другие дюжины связанных проблем.

Ответ 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 в этот поток github.

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