Den*_*sen 6 ruby rspec ruby-on-rails http-post rspec-rails
我目前正在 Rails 中开发 API 端点。如果我需要的数据无效,我想确保端点响应具有正确的错误状态。我需要一组 id。无效值之一是空数组。
{ vendor_district_ids: [2, 4, 5, 6]}
Run Code Online (Sandbox Code Playgroud)
{ vendor_district_ids: []}
Run Code Online (Sandbox Code Playgroud)
所以我想要一个请求规范来控制我的行为。
{ vendor_district_ids: [2, 4, 5, 6]}
Run Code Online (Sandbox Code Playgroud)
如您所见,我在subject块内的参数中使用了一个空数组。
在我的控制器中,我正在获取数据
params.require(:vendor_district_ids)
Run Code Online (Sandbox Code Playgroud)
值如下
{ vendor_district_ids: []}
Run Code Online (Sandbox Code Playgroud)
的值vendor_district_ids是一个带有空字符串的数组。当我用postman.
如果我发帖
{ "vendor_district_ids": [] }
Run Code Online (Sandbox Code Playgroud)
控制器将收到
require 'rails_helper'
RSpec.describe Api::PossibleAppointmentCountsController, type: :request do
let(:api_auth_headers) do
{ 'Authorization' => 'Bearer this_is_a_test' }
end
describe 'POST /api/possible_appointments/counts' do
subject(:post_request) do
post api_my_controller_path,
params: { vendor_district_ids: [] },
headers: api_auth_headers
end
before { post_request }
it { expect(response.status).to eq 400 }
end
end
Run Code Online (Sandbox Code Playgroud)
这里是空的数组。
我在请求规范中做错了什么还是这是一个错误RSpec?
Nem*_*ion 10
找到答案了!
正如前面的答案所示,问题是在机架内部发现的,query_parser而不是在机架测试内部发现的。
"paramName[]="into的实际翻译{"paramName":[""]}发生在 Rack 的query_parser中。
问题的一个例子:
post '/posts', { ids: [] }
{"ids"=>[""]} # By default, Rack::Test will use HTTP form encoding, as per docs: https://github.com/rack/rack-test/blob/master/README.md#examples
Run Code Online (Sandbox Code Playgroud)
将您的参数转换为 JSON,方法是将 JSON gem 请求到您的应用程序中'require 'json',并使用.to_json.
并在您的 RSPEC 请求中指定该请求的内容类型为 JSON。
修改上面的例子的例子:
post '/posts', { ids: [] }.to_json, { "CONTENT_TYPE" => "application/json" }
{"ids"=>[]} # explicitly sending JSON will work nicely
Run Code Online (Sandbox Code Playgroud)