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

时间:2015-03-20 21:09:09

标签: ruby-on-rails json rspec

这是一个简单的问题,我想尝试测试渲染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"}

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

1 个答案:

答案 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更改为您希望此规范的内容。

虽然我建议使用目录结构来指定您正在运行的规范类型。