web-dev-qa-db-fra.com

Jest arrêter la suite de tests après le premier échec

J'utilise Jest pour les tests.

Ce que je veux, c'est d'arrêter l'exécution de la suite de tests actuelle lorsqu'un test de cette suite échoue.

L'option --bail n'est pas ce dont j'ai besoin, car elle arrête les autres suites de tests après l'échec d'une suite de tests.

J'ai fait du kludge mais ça marche pour moi.

stopOnFirstFailed.js:

/**
 * This is a realisation of "stop on first failed" with Jest
 * @type {{globalFailure: boolean}}
 */

module.exports = {
    globalFailure: false
};

// Injects to jasmine.Spec for checking "status === failed"
!function (OriginalSpec) {
    function PatchedSpec(attrs) {
        OriginalSpec.apply(this, arguments);

        if (attrs && attrs.id) {
            let status = undefined;
            Object.defineProperty(this.result, 'status', {
                get: function () {
                    return status;
                },
                set: function (newValue) {
                    if (newValue === 'failed') module.exports.globalFailure = true;
                    status = newValue;
                },
            })
        }
    }

    PatchedSpec.prototype = Object.create(OriginalSpec.prototype, {
        constructor: {
            value: PatchedSpec,
            enumerable: false,
            writable: true,
            configurable: true
        }
    });

    jasmine.Spec = PatchedSpec;
}(jasmine.Spec);

// Injects to "test" function for disabling that tasks
test = ((testOrig) => function () {
    let fn = arguments[1];

    arguments[1] = () => {
        return module.exports.globalFailure ? new Promise((res, rej) => rej('globalFailure is TRUE')) : fn();
    };

    testOrig.apply(this, arguments);
})(test);

Importe ce fichier avant tous les tests (avant la première test(...)), par exemple mon index.test.js:

require('./core/stopOnFirstFailed'); // before all tests

test(..., ()=>...);
...

Ce code marque tous les tests suivants failed avec label globalFailure is TRUE lorsque la première erreur se produit.

Si vous voulez exclure failing, par exemple. Voici quelques tests de nettoyage que vous pouvez faire:

const stopOnFirstFailed = require('../core/stopOnFirstFailed');

describe('some protected group', () => {
    beforeAll(() => {
        stopOnFirstFailed.globalFailure = false
    });
    test(..., ()=>...);
    ...

Il exclut le groupe entier de failing.

Testé avec le noeud 8.9.1 et Jest 23.6.0

1
MixerOID

Je suppose que les autres tests de cette suite dépendent de la réussite de tous les tests précédents. C'est une mauvaise pratique dans les tests unitaires. Essayez d'utiliser beforeEach et afterEach pour découpler des scénarios de test individuels dans une suite, de sorte qu'ils ne s'appuient pas l'un sur l'autre.

0
Herman Starikov