无法在rails中的集成测试中使用会话变量

时间:2016-04-11 18:26:50

标签: ruby-on-rails ruby-on-rails-4

我在集成测试中使用会话存储的return_to URL时出现问题。

由于我的控制器可以从不同的地方进行访问,因此我将引用存储在 new 操作的会话中,并在 create 操作中重定向到它。

cards_controller.rb:
class CardsController < ApplicationController
...
  def new
    @card = current_user.cards.build
    session[:return_to] ||= request.referer
  end

  def create
    @card = current_user.cards.build(card_params)
    if @card.save
      flash[:success] = 'Card created!'
      redirect_to session.delete(:return_to) || root_path
    else
      render 'new', layout: 'card_new'
    end
  end
...
end

由于我只在测试中使用create动作,因此我想在集成测试中设置会话变量,就像在单元测试中一样,但它不起作用。我总是被重定向到根路径。

cards_interface_test.rb:
class CardsInterfaceTest < ActionDispatch::IntegrationTest
  test 'cards interface should redirect after successful save' do
    log_in_as(@user)
    get cards_path
    assert_select 'a[aria-label=?]', 'new'
    name = "heroblade"
    session[:return_to] = cards_url
    assert_difference 'Card.count', 1 do
      post cards_path, card: { name: name, icon: 'white-book', color: 'indigo', contents: 'subtitle | Rogue feature'}
    end
    assert_redirected_to cards_url
    follow_redirect!
    assert_match name, response.body
    assert_select 'td', text: name
  end
end

assert_redirected_to行上的测试失败。

我试图先调用get new_card_path,但没有任何区别,现在我有点迷失了。我不知道这是否应该基本起作用,但是我犯了一个小错误,或者如果我尝试完全违反最佳实践并且应该重构我的所有接口测试以使用像Selenium或类似工具的东西。

我也尝试将会话变量作为请求的一部分提供,例如rails指南描述的功能测试没有任何影响:

post cards_path, {card: { name: name, icon: 'white-book', color: 'indigo', contents: 'subtitle | Rogue feature' }}, {'return_to' => cards_url}

1 个答案:

答案 0 :(得分:2)

我不知道在集成测试中是否可以手动设置会话(猜测而不是)但是你应该能够设置引用,因为它只是一个普通的HTTP标头。在集成测试中,标题可以作为3rd parameter传递给请求方法助手(new等)。

所以,我认为您应首先使用referer标头集调用create操作(以便它进入会话),然后class CardsInterfaceTest < ActionDispatch::IntegrationTest test 'cards interface should redirect after successful save' do log_in_as(@user) # visit the 'new' action as if we came from the index page get new_card_path, nil, referer: cards_url assert_difference 'Card.count', 1 do post cards_path, card: { name: name, icon: 'white-book', color: 'indigo', contents: 'subtitle | Rogue feature'} end assert_redirected_to cards_url # ... end end 操作应该起作用,包括重定向。

new

首先,我们尝试使用referer设置获取session操作,就像我们来自索引页面一样(以便引用者可以进入List<Button> allButtons;)。其余的测试保持不变。