Ошибка ключей Stringify с Devise и декларативное тестирование с RSpec в Rails 3.1 - PullRequest
1 голос
/ 19 октября 2011

Трудно заставить Devise и декларативно играть в тестировании RSpec.

https://github.com/stffn/declarative_authorization/issues/95

ошибка stringify_keys после добавления переменных сеанса в функциональных тестах

Они оба касаются моей проблемы, но ни у одного из них не было решения, которое помогло бы мне.

# practices_controller_spec.rb
it "assigns a new practice as @practice as owner" do
  get_action(:new, @owner)
  assigns(:practice).should be_a_new(Practice)
  sign_out @owner
end

def get_action(action,user,*id)
  sign_in user
  get_with user, action, {:id => id}, session
end

# Spec test yields
Failure/Error: get_with user, action, {:id => id}, session
 NoMethodError:
   private method `stringify_keys' called for #<ActionController::TestSession:0x00000100d8a170>

Session looks like this: {"warden.user.user.key"=>["User", [1840], "$2a$04$2Rq4bHGp.tlIgKHE4PlRle"]}

Есть предложения по устранению этой ошибки?

Любая помощь будет принята с благодарностью. Спасибо!

UPDATE

Я заставил его работать следующим образом:

  def get_action(action,user,*id)
  sign_in user
  hashy = session['warden.user.user.key'][2]
  get_with user, action, {:id => id}, {"warden.user.user.key"=>["User", [user.id],hashy]}, nil

конец

1 Ответ

0 голосов
/ 20 мая 2013

Ваше обновление действительно помогло мне решить ту же проблему. Если я смогу немного расширить ваше решение в надежде, что это может быть полезно для (возможно, сейчас немногих) людей, обновляющих Rails 3.0 до 3.1 и использующих гемы разработки и декларативной авторизации.

Я использую Test :: Unit, а не RSpec, но я предполагаю, что это может быть легко интегрировано. Я бы добавил следующее в ActiveSupport :: TestCase (или что бы ни наследовал ваш класс testcase в RSpec). Это гарантирует, что другие пары ключ / значение сеанса также будут переданы в запрос.

class ActiveSupport::TestCase
  include Authorization::TestHelper # provides the declarative authorization get_with method

  def session_hash(user)
    temp_session = session.dup
    temp_session.delete("warden.user.user.key")
    {"warden.user.user.key"=>["User", [user.id],session['warden.user.user.key'][2]]}.merge(temp_session)
  end
end

И в вашем методе запрос get_with затем использует session_hash (user) вместо session. В Test :: Unit ноль в конце не был необходим

def get_action(action,user,*id)
  sign_in user
  get_with user, action, {:id => id}, session_hash(user)
end

Кажется, что декларативная авторизация не похожа на ActionController :: TestSession из Rails 3.1

...