2013-02-22 52 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