Подписанные куки и тест: единица не смешивается: "NoMethodError" - PullRequest
4 голосов
/ 03 июня 2011

Я использую подписанные куки для поддержки моего пользователя на страницах, в значительной степени реализованный как здесь .

Я использую два метода, sign_in (account) и sign_out, чтобы манипулировать моими куки, создаваяили уничтожить их так, как вы ожидаете ...

module SessionsHelper
  def sign_in account
    cookies.signed[:auth_account] = {
      :expires => 1.week.from_now,
      :value => [account.id, account.hash]
    }
  end

  def sign_out
    cookies.delete(:auth_account)
  end
end

Однако при попытке использовать этот метод или метод проверки подлинности, который соответствует ему в ApplicationController из функциональных тестов, я получаю NoMethodError:

NoMethodError: неопределенный метод, «подписанный» для {}: ActiveSupport :: HashWithIndifferentAccess

Из этого и этого я понимаю, чтоЭто проблема, связанная с тем, как файлы cookie по-разному определяются в тестовом примере, но я не могу заставить работать ни одно из этих решений.Для полноты, пример теста, который завершается неудачей с вышеуказанной ошибкой:

require 'test_helper'

class AccountsControllerTest < ActionController::TestCase
  include SessionsHelper

  setup do
    # We need to fake authentication by manually
    # assigning an account to the sign_in process
    sign_in accounts(:ia)

    @account = accounts(:ia)
  end

  test "should 403 on index if unauthenticated" do
    sign_out

    get :index
    assert_response :forbidden
  end

  test "should 200 on index if authenticated" do
    get :index
    assert_response :success
  end
end

1 Ответ

1 голос
/ 16 августа 2011

Вы не можете установить куки в своем тесте с переменной куки, как вы делаете в вашем контроллере. Переменная cookie в ваших тестах используется для чтения файлов cookie после выполнения запросов (get / post ...), а не для записи

Для того, чтобы подделать логин в ваших тестах, вы должны установить куки через @ request.cookies [: auth]

вы можете поместить следующий метод в свой test_helper и использовать его во всех ваших тестах

def signin user
  @request.cookies[:auth] = user.auth
end

и в ваших тестах

test "get dashboard if logged in" do
  signin @user
  get :index
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...