Search code examples
testingruby-on-rails-3.2functional-testingtestcase

Rails testing, how to specify path for post? (No route matches error)


I try to test one of my REST api controllers which is placed at "controllers/api/v1/bookings_controller.rb". The controller only responds_to json at the moment as you can see here:

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

  def create
    ...
  end 
end

My functional test is located at "test/functional/api/v1/bookings_controller_test.rb" and looks like following:

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

The post path for creating a booking looks like this (and works, tested with HTTP Client):

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

However when I run the test it seems that it uses some default route (see error message below), how can i specify the correct route in my test? Or is there some other mistake I do not see here?

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

Solution

  • Your route expects a user_id parameter. Add it to your post:

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