我如何在由 Capybara 提供支持的 rspec 功能测试中 post json 数据

How do I post json data in an rspec feature test powered by Capybara

小问题

我需要在功能测试中 post JSON,比如在我的控制器测试中:

post '/orders.json', params.to_json, format: :json

但是我需要在特性测试中做,而且page.driver.post只有post的表单数据。我如何在水豚中 post JSON?

详细说明

我有一个(非Rails)应用程序(我们称它为行星)posts JSON到我的rails应用程序(称其为星星) 创建一条记录,然后将用户转发到 url 进行显示操作。

我正在创建功能规范,但由于第一次交互不是 Rails 应用程序的一部分,我需要使用 JSON.

来模拟它

我一直在用这个:

page.driver.post '/orders.json', params.to_json

但这似乎post是一种形式,而我的星球应用posts JSON。这会导致一些非常奇怪的参数问题,其中解析 JSON 会给我与表单数据不同的参数。

如何在水豚中postJSON?

TL;DR - 你没有

Capybara 旨在模拟用户进行功能测试。因此,为什么 post 方法是特定于驱动程序的(page.driver.xxx)并且实际上并不打算直接由测试使用。用户不能只提交 POST 而没有页面来提交它。因此,如果你真的需要通过功能测试来测试这个,最好的解决方案是创建一个小的测试应用程序,提供一个页面,你可以让水豚访问它会自动(或点击按钮等)让浏览器使 AJAX post 到被测应用程序并处理响应。

所以,事实证明这对水豚来说是不可能的。有关详细信息,请参阅 的回答。

作为解决方法,我使用了 httparty:

require 'httparty'

RSpec.feature 'Checkouts', type: :feature do
  include HTTParty
  base_uri 'http://localhost:3000'

  private

  def checkout_with(cart)
    post orders_path(format: :json).to_s,
         body:    cart.to_json,
         headers: { 'Content-Type' => 'application/json' }
  end
end