我有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]
中的结果)
答案 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
请求永远不应触发破坏性操作。
答案 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)
您可以将参数添加到辅助方法,控制器可以照常读取它们。