gpt4 book ai didi

ruby-on-rails - capybara /rspec : should GET/PUT tests be in different files?

转载 作者:行者123 更新时间:2023-12-04 03:49:41 26 4
gpt4 key购买 nike

我正在关注 Ruby on Rails Tutorial ,现在我需要为授权代码编写测试,例如确保用户只能编辑自己的个人资料。

有两个 Action 要测试。一是确保用户无法访问编辑其他用户个人资料的页面。这很简单,是 capybara 中的简单“功能”测试。

但我当然也想测试 PUT 操作,这样用户就无法绕过编辑页面手动提交 PUT 请求。根据我的阅读,这应该作为 rspec“请求”测试来完成。

现在我的问题是,我必须在不同的目录中维护它们吗? (规范/功能与规范/请求)?这听起来不对,因为这两种情况密切相关。通常如何在 Rails 中完成此类测试?

例如,

describe "as wrong user" do
let(:user) { FactoryGirl.create(:user) }
let(:wrong_user) { FactoryGirl.create(:user, email: "wrong@example.com") }
before { sign_in user }

describe "visiting Users#edit page" do
before { visit edit_user_path(wrong_user) }
it { should_not have_selector('title', text: full_title('Edit user')) }
end

describe "submitting a PUT request to the Users#update action" do
before { put user_path(wrong_user) }
specify { response.should redirect_to(root_path) }
end
end

第二个测试在 capybara 2.x 中不起作用,因为不再支持“put”。它必须是一个请求测试。现在我必须编写第二个“sign_in”方法,因为当前使用的方法仅适用于功能测试。闻起来像很多代码重复。

========我的解决方案========

在弄清楚如何在请求测试中登录后,感谢 Paul Fioravanti 的回答,

    before do
post sessions_path, email: user.email, password: user.password
cookies[:remember_token] = user.remember_token
end

我将所有测试更改为请求测试。所以我不必将它们分成不同的文件。 Paul 的解决方案也可以,但我认为这更清洁。

describe 'authorization' do
describe 'as un-signed-in user' do
let(:user) { FactoryGirl.create(:user) }

describe 'getting user edit page' do
before { get edit_user_path(user) }

specify { response.should redirect_to(signin_path) }
end

describe 'putting to user update page' do
before { put user_path(user) }

specify { response.should redirect_to(signin_path) }
end
end

describe 'as wrong user' do
let(:user) { FactoryGirl.create(:user) }
let(:wrong_user) { FactoryGirl.create(:user, email: 'wrong@example.com') }

before do
post sessions_path, email: user.email, password: user.password
cookies[:remember_token] = user.remember_token
end

describe 'getting user edit page' do
before { get edit_user_path(wrong_user) }

specify { response.should redirect_to(root_path) }
end

describe 'putting to user update page' do
before { put user_path(wrong_user) }

specify { response.should redirect_to(root_path) }
end
end
end

最佳答案

在完成 Rails 教程并将我的示例应用程序升级到 Capybara 2.0 后,我最终经历了拆分请求和功能规范的艰巨过程。既然你说你目前仍在学习教程,我建议你只使用 Hartl 指定的 gems (Capybara 1.1.2),完成你的示例应用程序,然后返回请求/功能问题作为重构锻炼。不过,为了您的引用,这就是我最终编写“错误的用户”授权规范的方式:

spec/support/utilities.rb

def sign_in_through_ui(user)
fill_in "Email", with: user.email
fill_in "Password", with: user.password
click_button "Sign In"
end

def sign_in_request(user)
post session_path(email: user.email, password: user.password)
cookies[:remember_token] = user.remember_token
end

RSpec::Matchers::define :have_title do |text|
match do |page|
Capybara.string(page.body).has_selector?('title', text: text)
end
end

spec/features/authentication_pages_spec.rb

describe "Authentication on UI" do

subject { page }
# ...
describe "authorization" do
# ...
context "as a wrong user" do
let(:user) { FactoryGirl.create(:user) }
let(:wrong_user) { FactoryGirl.create(:user, email: "wrong@example.com") }

before do
visit root_path
click_link "Sign In"
sign_in_through_ui(user)
end

context "visiting Users#edit" do
let(:page_title) { full_title("Edit User") }
before { visit edit_user_path(wrong_user) }
it { should_not have_title(page_title) }
end
end
end
end

spec/requests/authentication_requests_spec.rb

describe "Authentication Requests" do

subject { response }
# ...
describe "authorization" do
# ...
context "as a wrong user" do
let(:user) { FactoryGirl.create(:user) }
let(:wrong_user) { FactoryGirl.create(:user, email: "wrong@example.com") }

before { sign_in_request(user) }

context "PUT Users#update" do
before { put user_path(wrong_user) }
it { should redirect_to(root_url) }
end
end

end
end

在尝试弄清楚如何将我的feature 规范与我的request 规范分开时,我主要使用以下两个链接作为引用:

更新:

如果您不想要自定义 RSpec 匹配器,您还可以在上面的测试中使用以下内容在 title 元素上获得相同的结果:

its(:source) { should have_selector('title', text: page_title) }

关于ruby-on-rails - capybara /rspec : should GET/PUT tests be in different files?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14686006/

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