Характеристики контроллера СУХОЙ с RSpec

В настоящее время я немного борюсь, пытаясь сохранить характеристики моего контроллера СУХИМИ и лаконичными, вплоть до одного утверждения для каждого примера. Я сталкиваюсь с некоторыми трудностями, особенно с тем, где разместить фактический вызов запроса контроллера в структуре, вложенной для соответствия различным граничным случаям.

Вот пример, упрощенный для демонстрации проблемы:

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 перед каждым утверждением. Есть ли способ лучше?

6
задан Chris Vincent 13 February 2012 в 20:12
поделиться