Как установить значение во 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