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

时间:2015-01-06 20:25:38

标签: 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

但是,这不会产生任何语法错误,但也不会发现实际上已损坏的链接。我怀疑我的语法有问题,但我不知道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逻辑,那么错误就会消失,但当然,我没有测试我想要的内容。

2 个答案:

答案 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等。