rspec json api 的控制器测试:ActionController::RoutingError

rspec controller test for json api : ActionController::RoutingError

只是一个关于渲染 json 调用的简单问题,我正在尝试测试。我仍在学习 rspec,并且尝试了所有方法,但似乎无法正常工作。我一直收到 ActionController::RoutingError,即使我定义了路由并且对 api 本身的调用有效。

在我的控制器中,我有以下方法:

class PlacesController < ApplicationController
  def objects
    @objects = Place.find(params[:id]).objects.active
    render json: @objects.map(&:api)
  end
end

使用渲染 json: @objects.map(&:api),我在对象模型中调用 api 方法

class Object
  def api
    { id: id,
      something: something,
      something_else: something_else,
      etc: etc,
      ...
    }
  end
end

我的路线文件:

get     "places/:id/objects"              => "places#objects"

我的 rspec: spec/controllers/places_controller_spec.rb

describe "objects" do 
  it "GET properties" do
    m = FactoryGirl.create :object_name, _id: "1", shape: "square"
    get "/places/#{m._id}/objects", {}, { "Accept" => "application/json" }

    expect(response.status).to eq 200
    body = JSON.parse(response.body)
    expect(body["shape"]).to eq "square"
  end
end

我一直收到错误

Failure/Error: get "/places/1/objects", {}, { "Accept" => "application/json" }
 ActionController::RoutingError:
   No route matches {:controller=>"places", :action=>"/places/1/objects"}

非常感谢任何帮助,谢谢。

因为您在 controllers 文件夹中有规范 RSpec 假设它是控制器规范。

对于控制器规范,您无需指定路由的整个路径,而是指定实际的控制器方法。

get "/places/#{m._id}/objects", {}

应该是

get :objects, id: m._id

如果您不想要这种行为,您可以通过将配置 infer_spec_type_from_file_location 设置为 false 来禁用它。或者您可以通过在 describe

上声明类型来覆盖此文件的规范类型

describe "objects", type: :request do - 将 :request 更改为您希望的规格。

尽管我建议使用目录结构来指示您的规格类型 运行。