Как установить значение во flash при тестировании действия

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

def my_action
  if flash[:something].nil?
    redirect_to root_path if flash[:something]
    return
  end

  # Do some other stuff
end

В моем тесте я делаю что-то вроде:

before(:each) do
  flash[:something] = "bob"
end

it "should do whatever I had commented out above" do
  get :my_action
  # Assert something
end

Проблема, с которой я сталкиваюсь, заключается в том, что у flash нет значений внутри my_action. Я предполагаю, что это происходит потому, что на самом деле запрос отсутствует.

Есть ли способ установить вспышку для теста, подобного этому?

Ответ 1

Проблема заключается в том, что использование флэш-хэша так, как вы делаете, означает, что он становится доступным только для следующего запроса. Чтобы установить хэш-значение Flash в значение для вашего теста, вы можете написать примерно следующее:

def test_something_keeps_flash
  @request.flash[:something] = 'bar'
  xhr :get, :my_action
  assert_response :success
  // Assert page contents here
end

Это гарантирует, что вы сможете проверить логику своего действия. Поскольку он теперь правильно установит хэш-флэш, введите my_action и выполните проверку флэш-хэш.

Ответ 2

Мне пришлось решить проблему simialr; У меня было действие контроллера, которое было перенаправлено на один из двух путей при завершении в зависимости от значения хэш-записи. Спектральный тест, который я нашел, работал для вашего примера выше:

it "should do whatever I had commented out above" do
  get :my_action, action_params_hash, @current_session, {:something=>true}
  # Assert something
end

@current_session - это хэш со специфическим для сеанса stuf; Я использую authlogic. Я нашел об использовании четвертого аргумента get для flash в [Руководство по тестированию Rails-приложений [1]). Я обнаружил, что тот же подход также работает для удаления; и я предполагаю, что все остальные.

Ответ 3

для меня работала с RoR 4.1:

flash_hash = ActionDispatch::Flash::FlashHash.new
flash_hash[:error] = 'an error'
session['flash'] = flash_hash.to_session_value

get :my_action