gpt4 book ai didi

ruby-on-rails - 无法在 Rails 的集成测试中使用 session 变量

转载 作者:行者123 更新时间:2023-12-03 12:17:01 25 4
gpt4 key购买 nike

我在集成测试中使用 session 存储的 return_to URL 时遇到问题。

因为我的 Controller 可以从不同的地方访问,所以我将 referer 存储在 new 操作的 session 中,并在我的 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

因为我只在测试中使用创建操作,所以我想像在单元测试中那样在集成测试中设置 session 变量,但它不起作用。我总是被重定向到根路径。

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 但没有任何区别,现在我有点迷路了。我不知道这是否应该基本上有效,但我犯了一个小错误,或者如果我尝试做一些完全违背最佳实践的事情并且应该重构我的所有接口(interface)测试以使用类似 Selenium 或类似工具的东西。

我也尝试提供 session 变量作为请求的一部分,就像 Rails 指南描述的功能测试一样,但没有效果:

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

最佳答案

我不知道在集成测试中是否可以手动设置 session (猜测而不是)但是您应该能够设置 referer 因为它只是一个普通的 HTTP header 。 header 可以作为 3rd parameter 传递到集成测试中的请求方法助手(get 等)。

因此,我认为您应该首先调用设置了引用 header 的 new 操作(以便它进入 session ),然后 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 操作,就像我们来自索引页面一样(以便引用可以进入 session)。其余测试保持不变。

关于ruby-on-rails - 无法在 Rails 的集成测试中使用 session 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36556397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com