it-swarm.com.ru

Jest Stop Test Suite после первого сбоя

Я использую Jest для тестирования.

Что я хочу, так это прекратить выполнение текущего набора тестов, если тест в этом тестовом наборе не пройден.

Опция --bail - это не то, что мне нужно, поскольку она останавливает другие наборы тестов после сбоя одного набора тестов.

5
Santiago Mendoza Ramirez

Я сделал немного клуджа, но это работает для меня.

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

Импортирует этот файл перед всеми тестами (перед первой test(...)), например, для моего index.test.js:

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

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

Этот код помечает все последующие тесты failed меткой globalFailure is TRUE при возникновении первой ошибки.

Если вы хотите исключить failing, например, некоторые тесты очистки вы можете сделать так:

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

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

Исключает всю группу из failing.

Протестировано с Node 8.9.1 и Jest 23.6.0

1
MixerOID

Я предполагаю, что другие тесты в этом наборе зависят от всех предыдущих тестов быть успешными. Это плохая практика в юнит-тестировании. Попробуйте использовать beforeEach и afterEach для разделения отдельных тестовых случаев в наборе, чтобы они не зависели друг от друга.

0
Herman Starikov