我在集成测试中使用会话存储的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}
答案 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;
)。其余的测试保持不变。