gem versionist(路径策略)测试rspec

时间:2013-02-22 11:29:43

标签: ruby-on-rails ruby rspec2

控制器

中有一个方法“sign_up”
# controller/v3/users_controller
# POST api/v3/users/sign_up
def sign_up    
  user = User.new(params[:user])
  if user.save && user.update_attribute(:channel, "user_#{user.id}")
    render json: { Auth: { message: t(:sign_up_ok), user_id: user.id, channel: user.channel } }, status: 201
  else
    render json: { errors: Oj.load(user.errors.to_json) }, status: 400
  end
end

route.rb

api_version(module: 'V3', path: 'api/v3') do
  resources :users, only: [:index, :show, :destroy] do
    collection do
    post 'sign_up'
    post 'sign_in'
  end
end

我正在尝试测试它:

require 'spec_helper'
describe V3::UsersController do
  describe "POST 'sign_up'" do
    it "should be successful" do
      post '/api/v3/users/sign_up'
      assert_response 200
    end
  end
end

收到错误:

V3::UsersController POST 'sign_up' should be successful
  Failure/Error: post '/api/v3/users/sign_up'
  ActionController::RoutingError:
    No route matches {:controller=>"v3/users", :action=>"/api/v3/users/sign_up"}
 # ./spec/controllers/v3/user_controller_spec.rb:7:in `block (3 levels) in <top (required)>'

rake routes

sign_up_api_v3_users POST    /api/v3/users/sign_up(.:format)     V3/users#sign_up

请告诉我如何测试这种方法?

红宝石1.9.3 导轨-3.2.12

1 个答案:

答案 0 :(得分:0)

该动作不应包括完整路径,只包括动作的名称。

post :sign_up

RSpec根据您使用的控制器推断路径的其余部分。正如您在错误消息中看到的那样,它发现控制器是v3 / users,它采取了您的操作,这不是一个有效的操作。