测试操作时如何在flash中放置一个值

时间:2011-10-17 11:59:15

标签: ruby-on-rails ruby ruby-on-rails-3 rspec

我正在尝试测试需要存储在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中没有值。我猜这是因为实际上没有请求发生。

有没有办法为这样的测试设置闪存?

3 个答案:

答案 0 :(得分:11)

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

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。 我发现在[A Guide to Testing Rails Applications[1]中使用了get的第四个参数。我发现同样的方法也适用于删除;我推测所有其他人。

答案 1 :(得分:7)

以下为RoR 4.1工作:

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

get :my_action

答案 2 :(得分:1)

问题在于,使用闪存散列的方式意味着它只能用于下一个请求。为了将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 并执行闪存哈希检查。