我创建了一个非常简单的 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 消息。
因此,问题是 - 为什么以及如何工作?