Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jest stop test suite after first fail

I am using Jest for testing.

What I want, is to stop executing the current test suite when a test in that test suite fails.

The --bail option is not what I need, since it will stop other test suites after one test suite fails.

like image 498
Santiago Mendoza Ramirez Avatar asked Jul 09 '18 16:07

Santiago Mendoza Ramirez


People also ask

What is Je beforeEach?

beforeEach(fn)Runs a function before each of the tests in this file runs. If the function returns a promise, Jest waits for that promise to resolve before running the test. This is often useful if you want to reset some global state that will be used by many tests.

Does Jest cleanup after each test?

It will be executed before every test suite (every test file). Because test runner is already initialised, global functions like beforeAll and afterAll are in the scope just like in your regular test file so you can call them as you like.


1 Answers

I've made some kludge but it works for me.

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

Imports that file before all tests (before first test(...)), for ex my index.test.js:

require('./core/stopOnFirstFailed'); // before all tests  test(..., ()=>...); ... 

That code marks all next tests failed with label globalFailure is TRUE when first error happens.

If you want to exclude failing, for ex. some cleanup tests you can do like this:

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

It excludes whole group from failing.

Tested with Node 8.9.1 and Jest 23.6.0

like image 81
mixalbl4 Avatar answered Sep 26 '22 11:09

mixalbl4