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
更改为您希望的规格。
尽管我建议使用目录结构来指示您的规格类型 运行。
只是一个关于渲染 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
更改为您希望的规格。
尽管我建议使用目录结构来指示您的规格类型 运行。