Rails测试,如何指定发布路径? (没有路由匹配错误)

时间:2012-11-12 15:06:57

标签: testing ruby-on-rails-3.2 functional-testing testcase

我尝试测试一个位于“controllers / api / v1 / bookings_controller.rb”的REST api控制器。控制器现在只响应于json,你可以在这里看到:

class Api::V1::BookingsController < ApplicationController
  respond_to :json  
  before_filter :authenticate_user!
  before_filter :get_user

  def create
    ...
  end 
end

我的功能测试位于“test / functional / api / v1 / bookings_controller_test.rb”,如下所示:

require 'test_helper'

class Api::V1::BookingsControllerTest < ActionController::TestCase
include Devise::TestHelpers

  setup do
    @booking = bookings(:one)
    @user = users(:one)
    sign_in @user
  end

  test "should return a bad request" do  
    post :create, :booking => { }, :format  => 'json'
    assert_response :bad_request
  end

end

创建预订的帖子路径如下(并且可以使用HTTP客户端测试):

api_v1_user_bookings 
GET /api/v1/users/:user_id/bookings(.:format)  api/v1/bookings#index
POST /api/v1/users/:user_id/bookings(.:format)  api/v1/bookings#create

然而,当我运行测试时,似乎它使用了一些默认路由(请参阅下面的错误消息),我如何在测试中指定正确的路由?还是有其他一些我在这里看不到的错误?

test_should_return_a_bad_request(Api::V1::BookingsControllerTest):
ActionController::RoutingError: No route matches {:booking=>{}, :format=>"js
on", :controller=>"api/v1/bookings", :action=>"create"}

2 个答案:

答案 0 :(得分:2)

您的路线需要user_id参数。将其添加到您的帖子:

post :create, :user_id => @user.id, :booking => {}, :format => :json

答案 1 :(得分:0)

好的,我想我现在明白了。我只需要添加用户ID,否则看起来rails没有选择正确的路由。所以正确的测试方法如下:

  test "should return a bad request" do  
    post :create, :user_id => @user.id, :booking => { }, :format  => 'json'
    assert_response :bad_request
  end
相关问题