我如何在由 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
小问题
我需要在功能测试中 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