如何使用Rspec和Capybara验证我没有死链接?

如何使用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 但是,这不会产生任何语法错误,也不会查找实际断开的

我试图使用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
但是,这不会产生任何语法错误,也不会查找实际断开的链接。我怀疑我的语法有问题,但我不知道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)
没有按预期失败。