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