ruby 如何在测试动作时将值放入flash

shstlldc  于 2023-03-08  发布在  Ruby
关注(0)|答案(3)|浏览(108)

我正在测试一个需要在闪存中存储值的动作。

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中没有值,我猜这是因为实际上没有请求发生。
有没有办法为这样的测试设置闪光灯?

xxls0lw8

xxls0lw81#

我不得不解决类似的问题;我有一个控制器操作,它在完成时根据哈希条目的值重定向到两个路径中的一个。对于上面的示例,我发现规范测试是有效的:

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是具有会话特定填充的散列;我用的是authlogic,我发现在[A Guide to Testing Rails Applications[1]中使用get的第四个参数,我发现同样的方法也适用于delete;我想其他人也一样。

yi0zb3m4

yi0zb3m42#

以下内容适用于RoR 4.1:

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

get :my_action
kxeu7u2r

kxeu7u2r3#

问题是你使用flash散列的方式意味着它只对下一个请求可用。为了给你的测试设置一个flash散列值,你可以写这样的代码:

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

这确保了你可以检查你的动作的逻辑,因为它现在可以正确地设置flash散列,输入你的my_action并检查flash散列。

相关问题