`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.

Другие вопросы по тегам