0

我创建了一个非常简单的 Rails 5 演示应用程序,其中包含一堆类别(Category模型)。有一个_category.html.erb部分带有删除类别的链接:

<%= 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 创建一个类别,访问类别页面并单击删除链接。之后Category.count应该等于 0(我还添加了其他检查,例如“期望 Flash 消息包含“类别已销毁!”,但这并不重要)。

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 链接具有method: :delete由 jquery_ujs 库处理的部分,该库基本上发送带有正确 HTTP DELETE 动词的请求。如果页面上禁用了 JavaScript,并且我尝试手动删除该类别,则它不起作用 - 发送了一个简单的 GET 请求。

我使用 Capybara 的默认 RackTest 驱动程序,它不支持 JavaScript。但是当我检查由它生成的页面截图时,page.save_and_open_page它确实有正确的 flash 消息。

因此,问题是 - 为什么以及如何工作?

4

1 回答 1

1

所以,这就是Capybara所做的。他们有一个选项respect_data_method https://github.com/teamcapybara/capybara/blob/99a0372aeeb0f3cc2b8962e1753371de58b288c7/lib/capybara/rack_test/node.rb#L58基本上检查data-method属性并发送正确的 HTTP 请求。

另外,特别感谢 Jamis Buck 注意到这一点。

于 2017-04-05T22:06:41.753 回答