Better setup for tests
I used to put the code for preparing each test in before
or setup
block, and clean it up in after
or teardown
. But what if the tests don't share the same setup? Easy, I can write something like this:
test('A', () => {
// preparing for test A
...
});
test('B', () => {
// preparing for test B
...
});
But what if test B depends on test A:
test('A', () => {
// preparing for test A
...
});
test('B', () => {
// Also depend on "preparing for test A"
// preparing for test B
// but if A fails or skipped, the setup of B is not complete
...
});
Normally this should work if tests are run synchronously. However, A lot of times I only want to run one test with grep. Or, if test A fails, test B also fails but it shouldn't. I was tempted to do something like this:
beforeEach(() => {
// testId indicates this setup is run immediately before which test
if (testId === 'A') {
// setup for test A
...
}
if (testId === 'B') {
// including the setup for test A
// setup for test B
...
}
});
You might say it is very easy to find a smarter way. This is true for use-cases when your setup doesn't include things like setting up a whole mock git history.
$ npm install --save-dev better-than-before
With this module, you could simplify your setup using beautiful declarative DSL syntax:
import { setups, preparing } from 'better-than-before';
setups([
() => {
// setup for all tests
},
() => {
// setup for all tests except for tests only need the first setup
},
...
]);
test('A', () => {
preparing(1); // I only need the first setup
});
test('B', () => {
preparing(2); // I need both first and second setup
});
...
The most straightforward way of using this module is to put this in the test block. But test frameworks like mocha also time how long a test runs and you might easily hit timeout. I could hack into the framework but I decided not to. Make sure you increase your timeout and ignore the performance warnings. If you use this module in a performance framework make sure it's not run in the test block.
MIT © Steve Mao