【问题标题】:rspec controller test for json api : ActionController::RoutingErrorjson api 的 rspec 控制器测试:ActionController::RoutingError
【发布时间】:2023-03-16 12:35:02
【问题描述】:

我正在尝试测试的渲染 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),我在Object模型中调用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"}

任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: ruby-on-rails json rspec


    【解决方案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 更改为您想要的规范。

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

    【讨论】:

    • 感谢 Carl 的回复,但是当我使用 get :objects, id: m._id 时,我收到错误 Failure/Error: get :objects, id: "1"。 NoMethodError:nil 的未定义方法“属性”:NilClass
    猜你喜欢
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    相关资源
    最近更新 更多