Rails5、RSpecwith RackTest-删除记录功能测试
Rails 5, RSpec with RackTest - deletion of a record feature test
我创建了一个非常简单的 Rails 5 演示应用程序,它有很多类别(Category
模型)。有一个 _category.html.erb
部分带有 link 以删除类别:
<%= link_to 'Remove', category_path(category), data: {method: :delete, confirm: 'Are you sure?'} %>
对应的destroy
动作:
@category.destroy
respond_to do |format|
format.js
format.html {redirect_to root_path, notice: 'Category destroyed!'}
end
绝对没有什么花哨的。然后我编写了一个 RSpec 功能测试,用 FactoryGirl 创建一个类别,访问类别页面并单击删除 link。之后 Category.count
应该等于 0(我还添加了其他检查,例如 "expect flash message to contain "Category destroyed!”,但这并不重要)。
require 'rails_helper'
RSpec.feature 'Category deletion' do
let!(:category) { create(:category) }
scenario 'should be successful' do
visit categories_path
click_link 'Remove'
page.save_and_open_page
expect(Category.count).to eq(0)
end
end
所以我的问题是这实际上有效,但我不太明白为什么。问题在于 Remove link 具有 method: :delete
部分,该部分由 jquery_ujs 库处理,该库基本上使用正确的 HTTP DELETE 动词发送请求。如果 JavaScript 在页面上被禁用并且我尝试手动删除该类别,它不起作用 - 发送了一个简单的 GET 请求。
我将默认的 RackTest 驱动程序与 Capybara 一起使用,它不支持 JavaScript。但是当我检查由 page.save_and_open_page
生成的页面截图时,它确实有正确的闪现消息。
因此问题是 - 为什么以及它究竟是如何工作的?
所以,那是水豚做的。他们有一个选项 respect_data_method
https://github.com/teamcapybara/capybara/blob/99a0372aeeb0f3cc2b8962e1753371de58b288c7/lib/capybara/rack_test/node.rb#L58,基本上检查 data-method
属性并发送正确的 HTTP 请求。
此外,特别感谢 Jamis Buck 注意到这一点。
我创建了一个非常简单的 Rails 5 演示应用程序,它有很多类别(Category
模型)。有一个 _category.html.erb
部分带有 link 以删除类别:
<%= link_to 'Remove', category_path(category), data: {method: :delete, confirm: 'Are you sure?'} %>
对应的destroy
动作:
@category.destroy
respond_to do |format|
format.js
format.html {redirect_to root_path, notice: 'Category destroyed!'}
end
绝对没有什么花哨的。然后我编写了一个 RSpec 功能测试,用 FactoryGirl 创建一个类别,访问类别页面并单击删除 link。之后 Category.count
应该等于 0(我还添加了其他检查,例如 "expect flash message to contain "Category destroyed!”,但这并不重要)。
require 'rails_helper'
RSpec.feature 'Category deletion' do
let!(:category) { create(:category) }
scenario 'should be successful' do
visit categories_path
click_link 'Remove'
page.save_and_open_page
expect(Category.count).to eq(0)
end
end
所以我的问题是这实际上有效,但我不太明白为什么。问题在于 Remove link 具有 method: :delete
部分,该部分由 jquery_ujs 库处理,该库基本上使用正确的 HTTP DELETE 动词发送请求。如果 JavaScript 在页面上被禁用并且我尝试手动删除该类别,它不起作用 - 发送了一个简单的 GET 请求。
我将默认的 RackTest 驱动程序与 Capybara 一起使用,它不支持 JavaScript。但是当我检查由 page.save_and_open_page
生成的页面截图时,它确实有正确的闪现消息。
因此问题是 - 为什么以及它究竟是如何工作的?
所以,那是水豚做的。他们有一个选项 respect_data_method
https://github.com/teamcapybara/capybara/blob/99a0372aeeb0f3cc2b8962e1753371de58b288c7/lib/capybara/rack_test/node.rb#L58,基本上检查 data-method
属性并发送正确的 HTTP 请求。
此外,特别感谢 Jamis Buck 注意到这一点。