In rspec you can do something like this:
let(:input) { 'foo' } before_each do setup_some_thing(input) end context 'when input is bar do let(:input) { 'bar' } it 'does something different' do end end context 'when input is baz do let(:input) { 'baz' } it 'does something else different' do end end This allows you to define a method call or instantiation of a large object as a sum of its smaller parts. You can then override those individual small parts inside different contexts. The idea being that you create a happy path before each test, and then specify deviations from the happy path within your context blocks.
Unfortunately, I can't seem to do this with Jest. I've tried the following:
beforeEach(() => { let input = 'foo'; beforeEach(() => { setupSomeThing(input); }); describe('when input is bar', () => { input = 'bar'; it('does something different', () => { }); }); describe('when input is baz', () => { input = 'baz'; it('does something different', () => { }); }); }); Because jest executes every describe block before running any specific describe block, input is always 'baz'. Does anyone know a work around, or a way to get the rspec behavior?
Thanks in advance!
Update
You can get similar behavior (albeit without lazy evaluation) using beforeAll.
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', () => { }); }); });
it?letlets act as declarative control switches to hit different branches of the code under test. This reduces the test to clean blocks specifying what the switches are (essentially specifying what logical branches to go through) followed by a set ofitblocks describing all of the things that should happen given that set oflets.