我试图使用Rspec和Capybara来验证生成的HTML页面没有死链接。大多数(如果不是全部)链接都是在同一文件系统上的相对HTML页面。
我正在寻找的是:
it 'has no broken links' do
all('a') do |link|
visit link[:href]
# 200 is the Ok HTTP response
page.status.should == 200
end
end
但是,这不会产生任何语法错误,但也不会发现实际上已损坏的链接。我怀疑我的语法有问题,但我不知道whepec是不是告诉了我。
编辑添加:我错过了.each
,但修复只会让我更接近。现在这是我的代码:
it 'has no dead or broken links' do
all('a').each do |link|
address = link[:href]
if address
if address.downcase.include?('http')
visit address
else
visit '/' + File.dirname(path) + '/' + address
end
# 200 is the Ok HTTP response
expect(page.status).to eq(200)
end
end
end
使用response.status
产生:
undefined local variable or method `response' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_1:0x007fcd1aa8e758>
使用page.status
产生:
undefined method `status' for #<Capybara::Session>
所以,我现在离我更近了,但我不知道要检查什么,看它是否已经装好。
第二次修改:
如果我将期望改为:
expect(page.title).to_not be_empty
我现在得到:
Capybara::Webkit::NodeNotAttachedError
不确定这意味着什么。
第3次修改:
我也可以改变期望:
expect(page.status_code).to eq(0)
在irb中进行测试表明0是我成功加载页面所需的代码。这仍会导致Capybara::Webkit::NodeNotAttachedError
结果。如果我删除了visit
逻辑,那么错误就会消失,但当然,我没有测试我想要的内容。
答案 0 :(得分:1)
Rspec的语法已被expect替换。试试这个:
(expect(response.status).to eq(200))
https://github.com/rspec/rspec-expectations/blob/master/Should.md
答案 1 :(得分:0)
您不应该使用Capybara的访问方法来查找损坏的链接。访问将始终遵循重定向并进入页面(即使是错误页面)。而是使用rack_tests:get方法并查看响应代码。此方法不会遵循重定向,因此您可以测试404等。