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