Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 我需要帮助在rails中编写rspec测试_Ruby On Rails_Ruby_Ruby On Rails 3_Rspec - Fatal编程技术网

Ruby on rails 我需要帮助在rails中编写rspec测试

Ruby on rails 我需要帮助在rails中编写rspec测试,ruby-on-rails,ruby,ruby-on-rails-3,rspec,Ruby On Rails,Ruby,Ruby On Rails 3,Rspec,我有一个项目\u controller.rb def get_serialized_copy_of_item @item= Item.find_by_id(params[:id]) if @item.nil? head :no_content else respond_to do |format| serialized_item = @item.as_json(include: [:test1, :test2, :test3, :

我有一个项目\u controller.rb

  def get_serialized_copy_of_item
    @item= Item.find_by_id(params[:id]) 
    if @item.nil?
      head :no_content
    else
      respond_to do |format|
      serialized_item = @item.as_json(include: [:test1, :test2, :test3, :test4])
      format.html
      format.json { render json: serialized_item }  
      end
    end
  end
routes.rb

namespace :items do
  get '/get_serialized_copy_of_item/:id', to:'items#get_serialized_copy_of_item'
end
我想写一个rspec测试

  • 提交不正确的项目id并确保返回204
  • 我已经做了

    require 'spec_helper'
    
    describe Items::ItemsController do
      describe "GET items#get_serialized_copy_of_item" do
         it "renders 204 status code" do
          get "/items/get_serialized_copy_of_item/dfsdf"
          expect(last_response.status).to eq(204)
        end
      end
    end
    
    错误:我得到路由错误

    F
    
    Failures:
    
      1) Items::ItemsController GET items#item renders 204 status code
         Failure/Error: get "/items/get_serialized_copy_of_item/dfsdf"
         ActionController::RoutingError:
           No route matches {:controller=>"items/items", :action=>"/items/get_serialized_copy_of_item/dfsdf"}
         # ./spec/controllers/items/items_controller_spec.rb:6:in `block (3 levels) in <top (required)>'
    
    Finished in 0.01576 seconds
    1 example, 1 failure
    
    Failed examples:
    
    rspec ./spec/controllers/items/items_controller_spec.rb:5 # Items::itemsController GET items#item renders 204 status code
    

    感谢

    RSpec采用测试名称中的控制器名称。请注意以下示例:

    这里RSpec已经知道路径的
    小部件
    部分,因为
    descripe-WidgetsController
    ,所以
    get
    方法只将
    :index
    作为参数

    要将其转化为您的案例:

    describe Items::ItemsController do
      describe "GET get_serialized_copy_of_item" do
         it "renders 204 status code" do
          get :get_serialized_copy_of_item, id: 'sdf'
    
          expect(response.status).to eq(204)
        end
      end
    end
    
  • 您只需要将操作的名称传递给
    get()
    方法,而不需要传递整个路径
  • 您需要将
    :id
    参数作为
    get()
  • 似乎
    名称空间
    在这里进行路由是错误的。尝试将路线定义更改为:
  • 这将生成以下路由:

    ➜  bundle exec rake routes
       Prefix Verb   URI Pattern     
    
        Controller#Action
    get_serialized_copy_item GET    /items/:id/get_serialized_copy(.:format) items#get_serialized_copy
    

    为此,您希望在
    app/controllers/items\u controller.rb

    RSpec中使用测试名称中的
    ItemsController
    。请注意以下示例:

    这里RSpec已经知道路径的
    小部件
    部分,因为
    descripe-WidgetsController
    ,所以
    get
    方法只将
    :index
    作为参数

    要将其转化为您的案例:

    describe Items::ItemsController do
      describe "GET get_serialized_copy_of_item" do
         it "renders 204 status code" do
          get :get_serialized_copy_of_item, id: 'sdf'
    
          expect(response.status).to eq(204)
        end
      end
    end
    
  • 您只需要将操作的名称传递给
    get()
    方法,而不需要传递整个路径
  • 您需要将
    :id
    参数作为
    get()
  • 似乎
    名称空间
    在这里进行路由是错误的。尝试将路线定义更改为:
  • 这将生成以下路由:

    ➜  bundle exec rake routes
       Prefix Verb   URI Pattern     
    
        Controller#Action
    get_serialized_copy_item GET    /items/:id/get_serialized_copy(.:format) items#get_serialized_copy
    

    为此,您希望在
    app/controllers/items\u controller.rb中安装
    ItemsController
    ,从我看到的情况来看,没有任何嵌套

    如果是这样,您应该调用
    ItemsController
    ,而不是
    Items::ItemsController

    项目\u控制器\u规格:

    require 'spec_helper'
    
    describe ItemsController do
      describe "GET #get_serialized_copy_of_item" do
         it "renders 204 status code" do
          get "/items/get_serialized_copy_of_item/dfsdf"
          expect(last_response.status).to eq(204)
        end
      end
    end
    

    据我所见,没有任何筑巢

    如果是这样,您应该调用
    ItemsController
    ,而不是
    Items::ItemsController

    项目\u控制器\u规格:

    require 'spec_helper'
    
    describe ItemsController do
      describe "GET #get_serialized_copy_of_item" do
         it "renders 204 status code" do
          get "/items/get_serialized_copy_of_item/dfsdf"
          expect(last_response.status).to eq(204)
        end
      end
    end
    

    我试过了,但我也犯了同样的错误。我还尝试了
    descripe ItemsController
    这个答案在我看来是正确的。您是否仍然得到以下信息:
    没有路由匹配{:controller=>“items/items”,:action=>“/items/get_serialized_copy_of_item/dfsdf”}
    ?@JagdeepSingh,yes
    ActionController::RoutingError:没有路由匹配{:id=>“sdf”,:controller=>“items/items”,:action=>“get_serialized_拷贝_of_item”}
    @kavin这绝对不是以前的错误。请注意,问题仍然是
    :controller
    部分:它表示没有与controller
    项/项匹配的路由。因此,您的路由和/或名称空间有问题things@kavin我在回答的最后补充了更多关于如何修复路线的内容。我试过了,但也遇到了同样的错误。我还尝试了
    descripe ItemsController
    这个答案在我看来是正确的。您是否仍然得到以下信息:
    没有路由匹配{:controller=>“items/items”,:action=>“/items/get_serialized_copy_of_item/dfsdf”}
    ?@JagdeepSingh,yes
    ActionController::RoutingError:没有路由匹配{:id=>“sdf”,:controller=>“items/items”,:action=>“get_serialized_拷贝_of_item”}
    @kavin这绝对不是以前的错误。请注意,问题仍然是
    :controller
    部分:它表示没有与controller
    项/项匹配的路由。因此,您的路由和/或名称空间有问题things@kavin我在回答的末尾添加了更多关于如何修复路由的内容。能否将
    bundle exec rake routes
    的输出添加到问题的末尾?@64位已添加。能否将
    bundle exec rake routes
    的输出添加到问题的末尾“你的问题?”六十四位补充道。