问题描述
我使用下面的代码来验证页面上没有使用 RSpec 和水豚的断开链接。
然后(“我希望主页上没有损坏的链接”)做
allinks = page.all('a')
allinks.each do |link|
get link[:href]
expect(page.status_code).to eq(200)
end
我对第 1 行的代码感到困惑。 4 和 5. 我正在尝试使用机架测试方法“get”来检查链接而不重定向到链接。 即使响应代码从 200 更改为 400,代码也不会抛出任何错误并通过。
解决方法
当你这样做时,我不确定 Capybara 发生了什么(我很久没用了)
我怀疑 page
是您当前“进入”的页面,可能已经记住了。
我建议您尝试使用例如 httparty
单独获取 URLresponse = HTTParty.get(link[:href])
expect(response.code).to eq(200)
相对 href 属性可能存在问题,例如
<a href="/home">I skipped domain</a>
但这超出了这个问题的范围。
,您是否正在尝试检查您的所有页面是否都没有损坏,即它们是否从 GET 请求中以正确的状态代码 (200) 响应?
我为此编写了此测试。您几乎可以将其复制粘贴到任何 Rails 5 应用程序中。
describe Rails.application.routes do
describe '#get',type: :request do
# This gets rails routes
let(:routes_info) { described_class.routes }
# this select GET routes
let(:routes_get) { routes_info.select { |r| r.verb == 'GET' } }
let!(:user) { create(:user) }
specify 'GET routes returns 200,301 or 302 code' do
routes_get.each do |route|
# parsing routes to a correct uri format
route = route.path.spec.to_s.gsub(/\(.:format\)*$/,'')
# route_with_params will replace ':security_token' with a test security token
get route_with_params(route,user)
expect(response.status).to eq(200).or eq(301).or eq(302)
end
end
def route_with_params(route,user)
route.gsub!(':security_token',user.security_token)
end
end
end
这里增加的复杂性是某些 GET 页面需要用户安全令牌,因此我必须为测试创建一个。