如何使用Rspec和Capybara验证我没有死链接?
我试图使用Rspec和Capybara来验证生成的HTML页面是否没有死链接。大多数(如果不是全部)链接都指向同一文件系统上的相对HTML页面 我要找的是:如何使用Rspec和Capybara验证我没有死链接?,rspec,capybara,Rspec,Capybara,我试图使用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 但是,这不会产生任何语法错误,也不会查找实际断开的
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
但是,这不会产生任何语法错误,也不会查找实际断开的链接。我怀疑我的语法有问题,但我不知道whey rspec没有告诉我这一点
编辑以添加:我缺少一个。每个,但修复它只会让我更接近。下面是我的代码:
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>
undefined method `status' for #<Capybara::Session>
所以,我现在更接近了,但我不知道该检查什么来查看它是否已加载
第二次编辑:
如果我改变计划,我希望:
expect(page.title).to_not be_empty
expect(page.status_code).to eq(0)
我现在得到:
Capybara::Webkit::NodeNotAttachedError
不知道那是什么意思
第三次编辑:
我还可以将预期更改为:
expect(page.title).to_not be_empty
expect(page.status_code).to eq(0)
irb内的测试表明,0是我希望成功加载页面的代码。这仍然会导致一个Capybara::Webkit::NodeNotAttachedError
结果。如果我删除visit
逻辑,那么错误就会消失,但当然,我并不是在测试我想测试的内容。Rspec的should语法已被expect替换。试试这个:
(expect(response.status).to eq(200))
您不应该使用水豚的访问方法来查找断开的链接。访问将始终遵循重定向并进入页面(即使是错误页面)。相反,使用rack_测试:get方法并查看响应代码。此方法不会遵循重定向,因此您可以测试404等。规格是否通过?规格是否通过,但我不知道是否有任何“a”链接被访问。就在您发布该评论之前,我发现我可以使用-w
选项运行rspec,这会产生许多超出我控制范围的警告(水豚中的循环要求),但也有以下内容:“警告:在无效上下文中可能无用地使用==”,这与我糟糕的should
语法相对应。你的建议没有这个问题,所以这很好。但是,它也没有找到我的死链接。因此,如果你要访问显式链接,请期待(response.status).to eq(200)
它返回什么?它通过了吗?我不确定如何查看单个响应值。我运行rspec
并获得“.”表示通过测试和“F”对于失败的测试。我会读更多。我的意思是,如果你期望一个链接被破坏,那么只测试该链接以检查响应。例如,如果你期望“/welcome”或welcome\u path
被破坏,只需执行访问welcome\u path;expect(response.status)。到eq(200)
访问“Breaked\u link”;expect(response.status)。到eq(200)
没有按预期失败。