Jest эквивалент RSpec ленивых оцененных переменных (let)?

В rspec вы можете сделать что-то вроде этого:

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

Это позволяет определить вызов метода или создание экземпляра большого объекта в виде суммы его меньших частей. Затем вы можете переопределить эти отдельные мелкие детали в разных контекстах. Идея состоит в том, что вы создаете счастливый путь перед каждым тестом, а затем указываете отклонения от счастливого пути в ваших блоках контекста.

К сожалению, я не могу сделать это с Jest. Я пробовал следующее:

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', () => {

    });
  });
});

Поскольку jest выполняет каждый блок описания перед запуском какого-либо конкретного блока описания, вход всегда является "baz". Кто-нибудь знает работу или способ получить поведение rspec?

Заранее спасибо!

Обновить

Вы можете получить подобное поведение (хотя и без ленивой оценки), используя 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', () => {

    });
  });
});

Ответы

Ответ 1

Лучшие решения, которые я нашел, были библиотеки как

https://github.com/stalniy/bdd-lazy-var

а также

https://github.com/tatyshev/given2

Если вы не хотите вводить зависимость, вы можете получить похожее поведение (хотя и без ленивой оценки), выполнив что-то вроде этого:

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', () => {

    });
  });
});