RSpec 不发送 JSON 格式的 Post 请求

tvi*_*ira 3 ruby json rspec ruby-on-rails

我正在做一个 Rails 应用程序,它主要是一个 API。我正在尝试测试我的 API 端点的控制器。我的 RSpec 控制器测试仪如下:

require 'rails_helper'
require 'spec_helper'
require 'rack/test'
require 'devise'

class RoutesControllerTest < ActionController::TestCase

  describe "User with token"
    test "should post route" do  
      params = { route: {  start_lat: 38.7627951, start_long: -9.1532211,
                            end_lat: 38.7483783, end_long: -9.155045,
                            flag_opt: 0.4, city: 1 }
                }

      post '/routes.json' , params.to_json, format: :json
      assert_response :success
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我的控制器是:

class RoutesController < ApplicationController

  def create
    city = City.find(params[:route][:city])
    user = current_user
    @route = user.routes.new(route_params)
    @results = @route.calc_route(@route.start_long, @route.start_lat, @route.end_long, @route.end_lat, params[:route][:flag_opt], city)
    if @route.save!
      render :template=>"/routes/routes.json.jbuilder", status: 201, :formats => [:json]
    else
      render json: @route.errors
    end
  end

  private

  def route_params
    json_params = ActionController::Parameters.new( JSON.parse(request.body.read) )
    json_params.require(:route).permit(
          :start_lat, 
          :start_long, 
          :end_lat, 
          :end_long,
          :flag_opt
     )
  end
end
Run Code Online (Sandbox Code Playgroud)

但每次运行时rspec spec/controller我都会遇到以下错误:

Failure/Error: json_params = ActionController::Parameters.new(JSON.parse(request.body.read) )

JSON::ParserError:
  757: unexpected token at 'route%5Bcity%5D=24&route%5Bend_lat%5D=41.26171490000001&route%5Bend_long%5D=-8.38193640000001&route%5Bflag_opt%5D=1&route%5Bstart_lat%5D=38.753225&route%5Bstart_long%5D=-9.144376&route%5Buser_id%5D=24'
Run Code Online (Sandbox Code Playgroud)

这意味着请求不是以 JSON 形式发送的

nic*_*icb 8

我也一直在为这个问题苦苦挣扎。有时您真的只想使用真实的 JSON 主体进行测试。我不确定这个解决方案是否特定于 Rails 5,但经过大量搜索后,我终于找到了这个解决方案,这让我松了一口气。

您可以使用as: :json而不是format: :json使 RSpec 格式化请求正文。

即改变:

post '/routes.json' , params.to_json, format: :json
Run Code Online (Sandbox Code Playgroud)

post '/routes.json' , params.to_json, as: :json
Run Code Online (Sandbox Code Playgroud)