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 注意到这一点。