这是一个简单的问题,我想尝试测试渲染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(&amp;: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"}
非常感谢任何帮助,谢谢。
答案 0 :(得分:1)
因为您在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
更改为您希望此规范的内容。
虽然我建议使用目录结构来指定您正在运行的规范类型。