【发布时间】:2023-03-13 09:12:01
【问题描述】:
我正在尝试使用 rspec、factory_girl 和 capybara 编写集成测试。我也安装了黄瓜,但我没有使用它(据我所知)。
我基本上想用我的用户预填充数据库,然后转到我的主页并尝试登录。它应该重定向到 user_path(@user)。
但是,我的 /rspec/requests/ 集成测试中似乎没有保留会话。
我的规范:/rspec/requests/users_spec.rb
require 'spec_helper'
describe "User flow" do
before(:each) do
@user = Factory(:user)
end
it "should login user" do
visit("/index")
fill_in :email, :with => @user.email
fill_in :password, :with => @user.password
click_button "Login"
assert current_path == user_path(@user)
end
end
返回:
Failures:
1) User flow should login user
Failure/Error: assert current_path == user_path(@user)
<false> is not true.
# (eval):2:in `send'
# (eval):2:in `assert'
# ./spec/requests/users_spec.rb:16
相反,它会重定向到我的 please_login_path - 如果由于任何原因登录失败(或者如果 session[:user_id] 未设置),就会发生这种情况。
如果我尝试放入 session.inspect,它会作为 nil 对象失败。
如果我尝试在控制器测试 (/rspec/controllers/sessions_spec.rb) 中执行此操作,我可以毫无问题地访问会话,并且可以调用 session[:user_id]
【问题讨论】:
-
我不知道这是否相关,但您应该无法通过键入@user.password 来获取用户密码。这是您的应用程序中的一个安全漏洞。您是否使用纯文本存储密码?
-
不相关,可能不是安全漏洞。对#password 的调用只返回一个密码,因为它是由工厂在实例变量中设置的。很可能他正在使用 Devise 或类似的东西,不会将密码属性以明文形式保存到数据库中,因此如果该实例变量消失,它将不可用。
标签: ruby-on-rails session rspec capybara