2015-10-12 3 views
0

мой routes.rbRSpec тестирования POST апи на подобласти

constraints subdomain: 'api' do 
    namespace :api, path: '/' do 
     scope '/v1' do 
     scope '/things' do 
      post '/', to: 'things#create' 
     end 
     end 
    end 
    end 

Все, что я хочу сделать сейчас тестирует метод POST здесь в RSpec тестирования контроллера:

it 'should create things on a post request' do 
    post 'create', 
    { thing: { foo: bar }.to_json 
    assert_equal 204, response.status 
end 

Я в конечном итоге получить это:

Failure/Error: post 'create', 
ActionController::UrlGenerationError: 
No route matches {:action=>"create", :controller=>"api/things"} 

Я полагаю, что это связано с api подобласти ограничения, так что я продолжаю пытаться инициализируется субдомена в RSpec:

request.host = 'api.mydevdomain.dev' 

Я также попытался включить весь URL в запросе на пост, но без успеха.

Как настроить субдомен в rspec для моего примера выше? Является ли это причиной ошибки или есть другая причина?

ответ

1

Try настройка маршрутов вверх, как это вместо:

Rails.application.routes.draw do 
    constraints subdomain: 'api' do 
    scope module: 'api', as: 'api' do 
     namespace 'v1' do 
     resources :things 
     end 
    end 
    end 
end 

Для того, чтобы настроить версированную апи вы должны поместить каждый контроллер в «версии модуля». Так что ваш Api :: ThingsController должно быть:

# controllers/api/v1/things_controller.rb 
class Api::V1::ThingsController 
    # ... 

    # POST /api/v1/things 
    def create 
    end 
end 

И тогда вы можете проверить его:

RSpec.describe Api::V1::ThingsController, type: :controller do 
    describe "POST #create" do 
    it "returns http success" do 
     post :create, { thing: { foo: bar }, format: :json} 
     expect(response).to have_http_status :created 
     expect(response.headers['location']).to eq thing_path(Thing.last) 
    end 
    end 
end 

Но если вы действительно хотите, чтобы проверить уровень маршрутизации, а также использовать request spec вместо этого. Это похоже на спецификацию, но без накладных расходов Capybara.

+0

Также обратите внимание, что вам не нужно вручную кодировать параметры запроса, на самом деле это может привести к двойным ошибкам кодирования. Просто установите формат и пусть RSpec выполнит свою задачу. – max

+0

Также я не уверен, почему вы получаете этот результат или почему ваша спецификация работает даже при наличии синтаксической ошибки. Но это проверено на работу. – max

Смежные вопросы