用capybara webkit填充params哈希

时间:2013-12-31 16:53:57

标签: ruby-on-rails capybara capybara-webkit

我有user_friendships控件的block操作的这条路线:

block_user_friendship PUT    /user_friendships/:id/block(.:format)     user_friendships#block

您需要知道的是,阻止操作需要:id

我可以在rspec规范中测试动作的结果视图,如下所示:

require 'spec_helper'
it "should not display the names of users who have a state of pending or requested" do
    visit "/user_friendships/1/block"
    page.should have_content("user with id of 1 blocked!")
end

但这是一个脆弱的规范,因为URL是硬编码的。如何使用:id变量填充参数哈希的block_user_friendship_path条目?

例如,这不起作用:

require 'spec_helper'
it "should not display the names of users who have a state of pending or requested" do
    visit block_user_friendship_path, id: "/23"
    page.should have_content("user with id of 23 blocked!")
end

No route matches {:action=>"block", :controller=>"user_friendships"} missing required keys: [:id]中的结果)

4 个答案:

答案 0 :(得分:9)

visit block_user_friendship_path, id: "/23"不起作用的原因是语法。

visit block_user_friendship_path, id: "/23" 表示:将带有id: "/23"的哈希值传递给 visit-method

你打算做什么(以及正确答案)是

visit block_user_friendship_path(id: "23")

表示:将id为23发送到 path-helper-method

答案 1 :(得分:2)

Capybara旨在用于全栈集成测试,因此推荐的方法是避免硬编码URL,而是驱动Capybara以用户身份浏览您的应用程序。这样可以确保指向应用程序中应该出现的块路径的链接,以及单击它们时它们的工作方式。

直接访问该网址即可跳过该网址,如果您需要发出PUT请求而不是GET请求,则该请求将无法正常运行,因为visit相当于粘贴浏览器地址栏中的网址:它始终发出GET个请求。

如果它使用完全硬编码的URL,那么您可能需要检查路由定义。如果阻止用户处理简单的GET请求,则可以在CSRF attack中使用此请求。 GET请求永远不应触发破坏性操作。

Alex Lynham的答案描述了一个Rails / RSpec控制器测试,而不是Capybara集成测试,如果你想要一个不能运行整个堆栈的低级别,那么像那个答案中建议的那样的控制器测试是一个很好的方法。去。

答案 2 :(得分:1)

除了水豚中的visit方法,我知道你得到post方法,所以我假设还有一个put方法。然后,您可以使用params发布特定请求,然后使用subject方法测试特殊response对象:

  context "post request" do
    before do
      post 'show', format: :txt, start_at: start_at, end_at: end_at, id: user.id
    end

    subject { response }

    its(:body) do
      should include(user.name)
    end
  end

上面粗略地讲了我用于测试带有params的post请求然后测试响应体的生产代码。希望它应该适合你(或者至少指出你正确的方向)。祝你好运!

编辑:post行显然还有其他一些你不需要的参数,我把它们放在说明中,以防万一你想要通过它。另请注意,这应该在控制器规范内,而不是请求规范。

答案 3 :(得分:0)

您可以将参数添加到辅助方法,控制器可以照常读取它们。