Jest equivalent to RSpec lazy evaluated variables (let)?
The best solutions I've found have been libraries like
https://github.com/stalniy/bdd-lazy-var
and
https://github.com/tatyshev/given2
If you don't want to introduce a dependency, you can get similar behavior (albeit without lazy evaluation) by doing something like this:
beforeEach(() => {
let input = 'foo';
beforeEach(() => {
setupSomeThing(input);
});
describe('when input is bar', () => {
beforeAll(() => {
input = 'bar';
});
it('does something different', () => {
});
});
describe('when input is baz', () => {
beforeAll(() => {
input = 'baz';
});
it('does something different', () => {
});
});
});
Use a beforeAll
to set variables in a parent beforeEach
.
Building on @Noah's own answer, I thought I would share our final solution with using this
as well.
describe( "Logging in", () => {
beforeEach( () => login( this.password ) ); // Steps are same for all so re-use but use different password.
describe( "when password is incorrect", () => {
beforeAll( () => this.password = "INCORRECT PASSWORD" );
it( "doesn't log in.", () => {
// Your assertion(s).
} );
} );
describe( "when password is correct", () => {
beforeAll( () => this.password = "CORRECT PASSWORD" );
it( "logs in successfully.", () => {
// Your assertion(s).
} );
} );
} );