web-dev-qa-db-fra.com

Problème d'exécution d'une tâche de karma de gulp

J'essaie d'exécuter des tests de karma à partir de gulp task et j'obtiens cette erreur:

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)

Mon système est Windows 7, la version de nodejs est v0.10.32, version de gulp:

[10:26:52] CLI version 3.8.8
[10:26:52] Local version 3.8.9

En outre, la même erreur que je reçois sur Ubuntu 12.04 LTS alors que sur Ubuntu plus récent (je ne sais pas quelle version) et Mac OS semble fonctionner correctement. Qu'est-ce qui peut causer cette erreur?

Mise à jour 11/05/2016: Avant de rédiger un commentaire sur le fait que la réponse acceptée masque les erreurs, veuillez vous reporter aux deux premiers commentaires de cette réponse acceptée. Utilisez-le uniquement si vous savez ce que vous faites. Informations connexes: https://github.com/karma-runner/gulp-karma/pull/15

64
Timur

Comment allez-vous vos tests avec Gulp? Je me suis récemment heurté à ce problème sous OSX en exécutant les nœuds v0.11.14 et gulp 3.8.10 chaque fois que des tests échouaient.

Changer de recommandé:

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

... s'est débarrassé de cette erreur.

Cela semble dépendre de la façon dont gulp traite les messages d'erreur lorsqu'une erreur est signalée dans un rappel. Voir Améliorer les messages d'erreur à la sortie pour plus d'informations.

130
McDamon

Aucune de ces solutions ne fonctionnait correctement pour moi avec gulp 3.9.1 et karma 1.1.1. Ajouter une référence à gulp-util npm install --save-dev gulp-util et mettre à jour la tâche ci-dessous corrige très bien le résultat de l'erreur, tout en maintenant correctement l'état de sortie.

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();
});
9
brocksamson

Vous trouverez ci-dessous un extrait de code tiré de modèles de gulp utilisant Karma. C'est un peu similaire, mais utilise également la méthode la plus récente pour démarrer le 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();
        }
    }
}
5
Igor Lino

Ce qui a fonctionné pour moi et donné un message d'erreur au format Nice est de fournir une instance Error au callback 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
Blacksonic

Si vous voulez retourner avec un code d'erreur et que vous voulez voir la sortie d'erreur de Karma mais pas la trace de pile de Gulp (probablement non liée):

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

c'est la manière de gulp de dire que vos tests ont échoué et que le karma est sorti avec un code de retour de 1. Pourquoi voulez-vous que l'appel soit fait vous-même et que l'erreur ne soit pas transmise car un message me déconcerte? 

1
Laurent Picquet

Je ne savais pas à propos d'Ubuntu, mais j'avais une erreur similaire sous Windows, et installer une version précédente la corrigeait immédiatement comme ceci:

npm install -g [email protected]
npm install [email protected]
1
onfilm
gulp.task('test', function(done) {
    karma.start({
        configFile: __dirname + '/karma.conf.js',
        singleRun: false 
    }, done);
});

passer l'argument singleRun: false empêchera le processus de retourner une valeur différente de 0 (ce qui signifierait une erreur et quitterait gulp).

Exécutez-le avec singleRun: true si vous lancez votre test à partir d'une ligne de commande et non d'une suite d'intégration continue.

0
deBrice

La bonne façon de résoudre ce problème selon la documentation de Karma et https://github.com/pkozlowski-opensource , est de s’appuyer sur le mécanisme de surveillance de Karma plutôt que sur celui de Gulp:

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

Notez l'omission de singleRun: true.

La solution de contournement de @ McDamon fonctionnera pour gulp.watch, mais vous ne voulez pas avaler de tels codes de sortie lorsque vous utilisez un serveur CI.

Gulp a également repensé sa façon de gérer les codes de sortie dans des scénarios similaires à celui-ci. Voir https://github.com/gulpjs/gulp/issues/71 et la douzaine d’autres questions connexes.

0
Seth

Si quelqu'un d'autre vient ici, n'utilisez pas la solution acceptée. Cela cachera les tests ayant échoué. Si vous avez besoin d’une solution rapide pour modifier votre tâche de test gulp, vous pouvez utiliser la solution trouvée dans ce fil comment in this github.

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