38

我刚刚了解了 RSpec 和 Cabybara 有多酷,现在围绕它学习编写实际测试。

我正在尝试检查单击链接后是否重定向到特定页面。下面是场景

1)我有一个页面 /projects/list
        - 我有一个带有 html "Back" 的锚点,它链接到 /projects/show

下面是我在 rspec 中写的测试

描述“样品”做
  描述“GET /projects/list”做
    它“样品测试”做
      访问“/项目/列表”
      click_link "返回"
      assert_redirected_to "/projects/show"
    结尾
  结尾
结尾

测试失败,并显示如下失败消息

    失败/错误:assert_redirected_to "/projects/show"
     参数错误:
       @request 必须是 ActionDispatch::Request

请建议我应该如何测试重定向以及我做错了什么?

4

4 回答 4

80

尝试current_path.should == "/projects/show"

Capybara 还实现了一个current_url完全限定 URL 的方法。

文档中的更多信息。

编辑

Capybara 现在有一个名为 have_current_path 的 RSpec 匹配器,您可以像这样使用它:(expect(page).to have_current_path(some_other_page_path)感谢@bjliu)

于 2012-06-29T03:12:49.927 回答
11

我不确定这是否是您所需要的,但在我的测试中,我更喜欢这种方法:

...
subject { page }
...
before do
    visit some_path_path
    # do anything else you need to be redirected
end
it "should redirect to some other page" do
    expect(page.current_path).to eq some_other_page_path
end
于 2014-06-22T15:41:03.383 回答
5

设计维基

在 Rails 中,当机架应用程序重定向时(就像 Warden/Devise 将您重定向到登录页面),集成会话不会正确更新响应。因此,助手 assert_redirected_to 将不起作用。

此页面也具有相同的信息:Rspec 确保我们以正确的路径结束

因此,您需要测试您现在是否在该 URL 上,而不是测试您是否被重定向到该 URL。

于 2012-06-27T14:04:48.833 回答
-3

您需要使用该路线,例如:

assert_redirected_to projects_path

而不是

assert_redirected_to "/projects/show"
于 2012-06-27T11:25:26.217 回答