【问题标题】:How do I use Rspec and Capybara to verify that I have no dead links?如何使用 Rspec 和 Capybara 来验证我没有死链接?
【发布时间】:2015-01-06 20:25:38
【问题描述】:

我正在尝试使用 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 没有告诉我。

编辑添加:我缺少.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

不知道这是什么意思。

第三次修改:

我还可以将期望更改为:

expect(page.status_code).to eq(0)

在 irb 中的测试表明 0 是我应该期望成功加载页面的代码。这仍然会导致 Capybara::Webkit::NodeNotAttachedError 结果。如果我删除了visit 逻辑,那么错误就会消失,但当然,那时我不会测试我想要的。

【问题讨论】:

  • 规格通过了吗?
  • 规范正在通过,但我不知道是否正在访问任何“a”链接。

标签: rspec capybara


【解决方案1】:

Rspec 的 should 语法已被替换为 expect。试试这个:

 (expect(response.status).to eq(200))

https://github.com/rspec/rspec-expectations/blob/master/Should.md

【讨论】:

  • 就在您发布该评论之前,我发现我可以使用 -w 选项运行 rspec,这会产生很多超出我控制范围的警告(水豚中的循环要求),但也是:“警告:在无效上下文中可能无用 == ”这对应于我糟糕的 should 语法。你的建议没有这个问题,所以很好。但是,它也没有找到我的死链接。
  • 那么,如果你要做visit explicit_broken_link; expect(response.status).to eq(200),它会返回什么?它通过了吗?
  • 我不确定如何查看单个响应值。我运行rspec 并得到“。”通过的测试和“F”表示失败的测试。我会去读更多的。
  • 我的意思是,如果您希望链接被破坏,则仅测试该链接以检查响应,例如如果您希望 '/welcome' 或 welcome_path 被破坏,请执行 visit welcome_path; expect(response.status).to eq(200)
  • visit 'broken_link'; expect(response.status).to eq(200) 确实失败了。
【解决方案2】:

您不应该使用 Capybara 的访问方法来查找损坏的链接。访问将始终遵循重定向并到达一个页面(即使它是一个错误页面)。而是使用 rack_tests :get 方法并查看响应代码。此方法不会跟随重定向,因此您可以测试 404 等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    相关资源
    最近更新 更多