web-dev-qa-db-ja.com

Jestは最初の失敗後にテストスイートを停止します

テストに Jest を使用しています。

私が望むのは、そのテストスイートのテストが失敗したときに、現在のテストスイートの実行を停止することです。

オプション --bailは、1つのテストスイートが失敗した後に他のテストスイートを停止するため、必要なものではありません。

私はいくつかのクラッジを作りましたが、それは私のために機能します。

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

Ex my _index.test.js_の場合、すべてのテストの前(最初のtest(...)の前)にそのファイルをインポートします。

_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でテスト済み

3
MixerOID

そのスイートの他のテストは、以前のすべてのテストが成功することに依存していると思います。これは単体テストでは悪い習慣です。 beforeEachafterEachを使用して、スイート内の個々のテストケースを分離し、互いに依存しないようにしてください。

0
Herman Starikov