Ruby RSpec определяет хуки до/после только для одного контекста

У меня есть следующая структура теста RSpec:

RSpec.describe A do
  context C1 do
    it EX1a do
    end
    ....
    it EX1n do
    end
  end
  context C2 do
    it EX2a do
    end
    ...
  end
end

Теперь я бы определил хук, который запускает установку и завершение работы wordk только для примеров в контексте C1. Как я могу это сделать? Насколько я понимаю, структуры хуков использование before(:context) будет выполняться один раз перед каждым контекстом (включая C2), а before(:example) будет выполняться один раз перед каждым примером (включая EX2a), чего я не хочу.

У меня RSpec 3.8.


person user1934428    schedule 16.01.2020    source источник


Ответы (1)


Не совсем. Это зависит от того, где вы разместите блоки before. Когда вы помещаете их в контекст, подобный этому

RSpec.describe A do
  context C1 do
    before { do_something }

    it EX1a do
    end
    it EX1n do
    end
  end
  context C2 do
    it EX2a do
    end
  end
end

тогда обратный вызов before будет выполняться только перед запуском EX1a и EX1n, но не перед EX2a.

Аналогично для блоков before(:context). Цитата из документации: "before(:context) запускать только один раз перед всеми примерами в группе". Блок context определяет блок group.

person spickermann    schedule 16.01.2020
comment
Большой! Но что произойдет, если rspec будет вызываться с случайным порядком выполнения? Насколько я понимаю, это означает, что Ex2a может выполняться между Ex1a и Ex1n. Будет ли тогда RSpec запускать мой after-hook перед примером из контекста C2 и перед входом в следующий пример из контекста C1? - person user1934428; 16.01.2020
comment
Порядок групп рандомизирован в RSpec @user1934428. Это означает, что содержимое контекста C2 не будет смешиваться с содержимым в контексте C1. Согласно документам Вложенные группы всегда запускаются от верхнего уровня к нижнему, чтобы избежать повторного выполнения перехватчиков до(:context) и после(:context), но порядок групп на каждом уровне случайным образом. - person Sebastian Palma; 16.01.2020