`flash.discard` в Rails 2.3 терпит неудачу, потому что flash - это Hash, а не FlashHash
Учитывая функциональный тест, такой как:
def test_exciting_rails_upgrades
login(m=users(:manager))
post :import_users_map_fields, :csv_file => fixture_file_upload('/users.csv', 'text/csv')
assert flash.empty?
flash.discard
# other goodies omitted
end
В Rails 2.3.2 ошибок нет, однако в 2.3.15 ошибка такова:
NoMethodError: неопределенный метод `discard'для {}: хэш /test/functional/broken_upgrades.rb:119:in `test_exciting_rails_upgrades'
Почему flash
Hash
класс вместо FlashHash
?
Из исходного кода он выглядит как 2.3.2 и 2.3.15 файлы ActionPack lib/action_controller/flash.rb
создать FlashHash
класс и наследовать от Hash
, Однако то, что показано в этом функциональном тесте в 2.3.2 и 2.3.15, является Hash
класс, а не HashFlash
, поэтому нельзя назвать сброс на это.
Может кто-нибудь еще воспроизвести эту ошибку с 2.3.15 и flash.discard
?
1 ответ
Вот два теста, которые вы можете использовать, чтобы доказать, что ActionController изменяет тип 'flash' в зависимости от того, установлен он или нет.
В моем приложении вы не можете видеть: index, если вы не вошли в систему, поэтому в test_flash_is_now_a_flashhash вы видите, что флеш-память была установлена бэкэндом правильно, а в test_flash_is_a_plain_hash - нет.
def test_flash_is_a_plain_hash
login(users(:permitted_user))
get :index
assert flash.instance_of?(Hash)
end
def test_flash_is_now_a_flashhash
get :index
assert_redirected_to :controller => "login"
assert flash.instance_of?(ActionController::Flash::FlashHash)
end
Вы можете убедиться в этом в коде ActionController:: TestRequest:
def flash
session['flash'] || {}
end
Обновление: это было исправлено в ветке Rails 2-3-stable.