对于使用 RSpec 3+ 的应用程序,您不希望使用 Capybara 发出 HTTP POST 请求。Capybara 用于模拟用户行为,并接受由此产生的 JS 行为和页面内容。最终用户不会在您的应用程序中形成对资源的 HTTP POST 请求,用户单击按钮、单击 ajax 链接、拖放元素、提交 Web 表单等。
查看这篇关于 Capybara 和其他 HTTP 方法的博客文章。作者提出以下主张:
你有没有看到任何提到 get、post 或 response 之类的方法?不?那是因为水豚中不存在这些。让我们非常清楚这一点......Capybara 不是一个适合测试 API 的库。你有它。不要使用 Capybara 测试 API。它不是为它设计的。
因此,无论是否开发 API,如果您必须发出明确的 HTTP POST 请求,并且它不涉及 HTML 元素和某种事件(单击、拖动、选择、聚焦等),那么它不应该是用 Capybara 测试。如果您可以通过单击某个按钮来测试相同的功能,那么请使用 Capybara。
您可能想要的是RSpec Request specs。在这里,您可以进行post
调用以及任何其他 HTTP 方法,并对响应断言期望。您还可以模拟 n 个存根对象和方法,以断言对在您的请求和响应之间发生的副作用和其他行为的期望。
# spec located in spec/requests/project_file_upload_spec.rb
require "rails_helper"
RSpec.describe "Project File Upload", type: :request do
let(:project) { create(:project) }
let(:file) { File.new(File.join(::Rails.root.to_s, 'path/to/file.ext')) } # can probably extract this to a helper...
it "accepts a file uploaded to a Project resource" do
post "project/#{project.id}/upload", upload_path: file
expect(response).to be_success
expect(project.file?).to eq(true)
# expect(project.file).not_to eq(nil)
expect(response).to render_template(:show)
end
end