В настоящее время я немного борюсь, пытаясь сохранить характеристики моего контроллера СУХИМИ и лаконичными, вплоть до одного утверждения для каждого примера. Я сталкиваюсь с некоторыми трудностями, особенно с тем, где разместить фактический вызов запроса контроллера в структуре, вложенной для соответствия различным граничным случаям.
Вот пример, упрощенный для демонстрации проблемы:
describe MyController do
let(:item) { Factory(:item) }
subject { response }
describe "GET #show" do
before(:each) do
get :show
end
context "published item" do
it { should redirect_to(success_url) }
end
context "unpublished item" do
before(:each) do
item.update_attribute(published: false)
end
it { should redirect_to(error_url) }
end
end
end
Очевидно, что это надуманный пример, но он показывает, что я хотел бы сделать, а что не работает. В основном проблема заключается в блоке перед
в контексте «неопубликованных». Что происходит, так это то, что изменение, которое я внес в данные настройки, на самом деле происходит после вызова get
из-за способа вложенности контекстов, поэтому пример в этом контексте фактически работает с начальным сценарий, а не тот, который я намереваюсь.
Я понимаю, почему это происходит и как гнездятся контексты. Я полагаю, что я хотел бы, чтобы имел какой-то способ сообщить RSpec, что я хочу, чтобы он запускался правильно после любых до
хуков еще правильно перед любые утверждения в данном контексте. Это было бы идеально для спецификаций контроллера.Я хотел бы воспользоваться вложенностью в спецификации моего контроллера, чтобы постепенно создавать вариации крайних случаев без необходимости разбрасывать вызов get
или даже вызов помощника do_get
в каждый из моих it
утверждений. Особенно раздражает синхронизация с любыми пользовательскими макросами it_should
, которые я использую.
Есть ли что-нибудь в RSpec в настоящее время для этого? Могу ли я использовать какие-нибудь уловки, чтобы приблизиться? Казалось бы, это идеально подходит для того, как я видел, как многие люди пишут спецификации своих контроллеров; судя по тому, что я обнаружил, люди в основном соглашаются с вызовом помощников do_get
перед каждым утверждением. Есть ли способ лучше?