2013-02-22 21 views
0

有一个在控制器的方法 “sign_up”宝石versionist(路径策略)测试rspec的

# 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)>' 

耙路线

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

请给我建议如何测试这种方法吗?

红宝石1.9.3 轨-3.2.12

+0

见http://stackoverflow.com/questions/14586573/specs-for-controller-inside-a-module-versionist/14593358#14593358 是您的规格控制器规格或要求规范吗? – 2013-02-22 21:07:41

+0

噢,谢谢。我把它移到一个请求规范,它工作 – Nitrino 2013-02-25 05:20:39

回答

0

的行动不应该包括完整路径,操作的只是名字。

post :sign_up 

RSpec的推断路径根据您使用的控制器上休息。正如您在错误消息中看到的那样,它发现控制器是v3 /用户,并且它采取了您的操作,这不是有效的操作。

+0

我用宝石版本。我发送以下请求:localhost:3000/api/v3/users/sign_up 如果我使用post:sign_up得到相同的错误:没有路由匹配{:controller =>“v3/users”,:action =>“sign_up” } – Nitrino 2013-02-22 11:45:14

+0

我不确定,我知道rspec控制器规范不会采用路径,因为它们不像请求规范那样经过中间件堆栈。你是否缺少一些必需的参数? – Cluster 2013-02-22 12:00:12

+0

不,即使我向索引发送请求时,也会得到相同的错误 – Nitrino 2013-02-22 12:04:26