Uitvoeren van karma-taak van gulp

Ik probeer karma-tests uit te voeren vanuit de gulp-taak en ik krijg deze foutmelding:

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)

Mijn systeem is Windows 7, nodejs-versie is v0.10.32, gulp-versie:

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

Ook dezelfde fout die ik krijg op Ubuntu 12.04 LTSterwijl ik op nieuwere Ubuntu (niet zeker welke versie) en mac os het lijkt te werken. Wat kan deze fout veroorzaken?

Update 5/11/2016: voordat u een opmerking schrijft over het feit dat het geaccepteerde antwoord fouten verbergt, raadpleegt u alstublieft de eerste twee opmerkingen bij dat specifieke geaccepteerde antwoord. Gebruik het alleen als u weet wat u doet. Gerelateerde informatie: https://github.com/karma-runner/gulp-karma/pull/15


Antwoord 1, autoriteit 100%

Hoe voert u uw tests uit met Gulp? Ik kwam dit probleem onlangs tegen op OSX, met node v0.11.14en gulp 3.8.10, telkens als er mislukte tests waren.

Wijzigen van de aanbevolen:

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

Aan:

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

…van deze fout af.

Het lijkt te maken te hebben met hoe gulp omgaat met foutmeldingen wanneer een fout wordt gesignaleerd in een terugbelverzoek. Zie Foutmeldingen verbeteren bij afsluitenvoor meer informatie.


Antwoord 2, autoriteit 7%

Geen van deze oplossingen werkte correct voor mij met gulp 3.9.1 en karma 1.1.1. Door een verwijzing naar gulp-util npm install --save-dev gulp-utiltoe te voegen en de taak bij te werken naar het onderstaande, wordt de foutoutput heel mooi opgelost, terwijl de exit-status correct wordt behouden.

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

Antwoord 3, autoriteit 4%

Hieronder staat een codefragment van slikpatronen over het gebruik van Karma. Het lijkt een beetje op elkaar, maar gebruikt ook de nieuwere methode om het karma te starten.

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

Antwoord 4, autoriteit 4%

Wat voor mij werkte en een mooi opgemaakt foutbericht gaf, is om een ​​Error-instantie te geven aan de donecallback.

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

Antwoord 5, autoriteit 2%

Als je wilt terugkeren met een foutcode en de foutoutput van Karma wilt zien, maar niet de (waarschijnlijk niet-gerelateerde) stacktrace van Gulp:

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

Antwoord 6

Niet zeker over Ubuntu, maar ik kreeg een soortgelijke fout op Windows, en het installeren van een versie terug loste het meteen als volgt op:

npm install -g [email protected]
npm install [email protected]

Antwoord 7

dit is de manier van slokje om te vertellen dat je tests zijn mislukt en dat karma is afgesloten met een retourcode van 1. Waarom zou je zelf klaar willen zijn en de fout niet doorgeven, omdat een bericht me verbijstert.


Antwoord 8

De juiste manier om dit op te lossen volgens Karma’s documentatie en https://github.com/pkozlowski-opensource, is te vertrouwen op Karma’s horlogemechanisme in plaats van Gulp’s:

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

Let op het weglaten van singleRun: true.

De tijdelijke oplossing van @McDamon werkt voor gulp.watch, maar u wilt dergelijke exit-codes niet slikken wanneer u op een CI-server draait.

Gulp herwerkt ook hoe ze exit-codes verwerken in scenario’s zoals deze. Zie https://github.com/gulpjs/gulp/issues/71en de andere een tiental gerelateerde problemen.


Antwoord 9

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

het doorgeven van het argument singleRun: falsevoorkomt dat het proces een andere waarde van 0 retourneert (wat een fout zou betekenen en de slok zou afsluiten).

Uitvoeren met singleRun: trueals u uw test alleen start vanaf een opdrachtregel en niet als onderdeel van een suite voor continue integratie.


Antwoord 10

Als iemand anders hier komt, gebruik dan niet de geaccepteerde oplossing. Het zal mislukte tests verbergen. Als je een snelle oplossing nodig hebt om je gulp-testtaak aan te passen, kun je de oplossing gebruiken die je vindt in deze reageerin dezegithub-thread.

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

Other episodes