Как написать макрос контроллера RSpec, который может принимать аргументы, определенные let или в блоке before? - PullRequest
7 голосов
/ 15 июля 2011

Я использую Rails 3 и RSpec 2.6.0.

Не уверен, что это возможно, но вот что я хотел бы сделать:

describe UsersController do
  let(:user) { Fabricate :user }
  describe "GET /user/:id" do
    should_return_401_code_if_user_is_not_confirmed :get, :show, :id => user.id
  end
  describe "PUT /user/:id" do
    should_return_401_code_if_user_is_not_confirmed :put, :update, :id => user.id
  end
end

Я пытался реализовать макроскак это:

module ControllerMacros
  def should_return_401_code_if_user_is_not_confirmed(verb, action, params = {})
    it "returns a 401 code if the user is not an admin" do
      send verb, action, params
      response.code.should == "401"
    end
  end
end

Но при запуске этих спецификаций я получаю ошибку undefined local variable or method 'user'.Я попытался переключиться на переменную @user, определенную в блоке before, но она тоже не работает.Я подозреваю, что это потому, что я не в примерном блоке.

Возможно ли передать в контроллер макрокоманды, определенные с помощью let или в блоке before?

Спасибо!

1 Ответ

6 голосов
/ 30 декабря 2011

После прочтения этой цепочки в списке рассылки rspec-users появляется ответ «нет». Проблема в том, что ваши переменные let / before не инициализируются до блока it в теле вашего макроса, поэтому вы не можете ссылаться на них как параметры для вызова макроса.

Я пытаюсь сделать то же самое на сайте, над которым я работаю. Решение, с которым я собираюсь пойти, - это вызвать метод макроса с блоком, который вернет хэш params, который вы хотите, а затем использовать instance_eval в теле макроса для оценки блока с использованием области действия макроса.

#spec
...
describe "GET /user/:id" do
  should_return_401_code_if_user_is_not_confirmed :get, :show { {:id => user.id} }
end

#macro
...
def should_return_401_code_if_user_is_not_confirmed(verb, action, &params_block)
  it "returns a 401 code if the user is not an admin" do
    params = instance_eval &params_block
    send verb, action, params
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...