Rails 5 Rspec请求测试中如何设置Session变量?
嘿,这个问题我熟!在Rails的request test spec里设置session变量其实很直接,分两种常见场景给你说清楚:
1. RSpec Request Spec 场景
如果你用的是RSpec的request测试(type: :request),在发送POST请求的时候,直接给请求方法传入session参数就行,把user_id和order_id放进这个哈希里:
RSpec.describe "Payment Requests", type: :request do # 先提前创建测试用的用户和订单(假设你用FactoryBot,不用的话换成手动创建) let(:test_user) { create(:user) } let(:test_order) { create(:order, user: test_user) } it "successfully processes the payment when session has valid user and order" do # 发送POST请求时,通过session参数注入需要的变量 post payments_path, params: { payment: { amount: 99.99, payment_method: "credit_card" } }, session: { user_id: test_user.id, order_id: test_order.id } # 这里可以加你的断言,比如检查响应状态码或者数据库变化 expect(response).to have_http_status(:ok) expect(Payment.last.user_id).to eq(test_user.id) end end
这个session参数会直接把键值对注入到请求的session中,你的PaymentController里的before_action就能正常读取到session[:user_id]和session[:order_id]了。
2. Rails 内置系统测试场景
如果是用Rails原生的系统测试(继承自ActionDispatch::SystemTestCase),设置session的方式更直接,直接给session对象赋值就行:
class PaymentSystemTest < ActionDispatch::SystemTestCase test "completes payment with valid session data" do user = User.create!(email: "test@example.com", password: "password123") order = Order.create!(user: user, total_amount: 50.0) # 直接设置session变量 session[:user_id] = user.id session[:order_id] = order.id # 发送POST请求 post payments_path, params: { payment: { ... } } # 断言逻辑 assert_response :success end end
小提醒
别忘了确保你的require_user和require_order方法逻辑是正确的,比如require_user应该是从session里取id然后查找用户:
def require_user @user = User.find(session[:user_id]) redirect_to login_path unless @user end
这样测试里注入的session值才能被正确识别。
内容的提问来源于stack exchange,提问作者Shaun Wan
相关产品推荐
相关产品推荐

