以下是一些步骤和示例,展示如何在不同测试级别中处理 cookie 的过期测试:
1. 控制器或请求测试
在这个级别,您主要关注的是控制器如何设置 cookie,并确保它们在预期时间后过期。
示例
假设您有一个控制器 SessionsController
,它在用户登录时设置一个 cookie:
rubyclass SessionsController < ApplicationController def create cookies.signed[:user_id] = { value: @user.id, expires: 2.hours.from_now } redirect_to root_path end end
您可以编写一个测试来模拟时间的流逝,并验证 cookie 是否正确过期:
rubyrequire 'rails_helper' RSpec.describe SessionsController, type: :controller do describe "POST #create" do before do @user = FactoryBot.create(:user) post :create, params: { user: { username: @user.username, password: 'secret' } } end it "sets a signed user_id cookie with an expiry time" do expect(cookies.signed[:user_id]).to eq(@user.id) expect(response.cookies['user_id']).to be_present end it "expires the cookie after 2 hours" do travel_to 3.hours.from_now expect(cookies.signed[:user_id]).to be_nil expect(response.cookies['user_id']).not_to be_present end end end
在这个测试中,我们使用了 travel_to
方法来前进时间,这是 Rails 提供的一种方法,用于在测试中模拟时间的流逝。
2. 集成测试
如果您想在更广泛的应用流程中测试 cookie 的过期(如用户登录后的行为),您可以使用集成测试来实现。
示例
rubyrequire 'rails_helper' RSpec.describe "User login and session expiration", type: :feature do scenario "User logs in and then the session expires after 2 hours" do user = FactoryBot.create(:user) visit login_path fill_in "Username", with: user.username fill_in "Password", with: 'secret' click_button "Login" expect(page).to have_content("Welcome, #{user.username}") travel_to 3.hours.from_now visit some_protected_path expect(page).to have_content("Please login to continue") expect(page).not_to have_content("Welcome, #{user.username}") end end
在这个集成测试中,我们首先模拟用户登录,然后使用 travel_to
方法前进时间超过 cookie 的过期时间,并验证用户是否被重定向到登录页面,以及欢迎消息是否不再显示。
总结
在 RSpec 中测试 cookie 的过期可以在不同的测试级别上进行,关键是使用诸如 travel_to
这样的时间模拟方法来确保您可以在不同时间点检查应用的行为。这样的测试有助于确保您的应用能够正确处理 session 和 cookie 的管理,增强安全性和用户体验。
2024年8月12日 14:08 回复