Метод PUT возвращает 405 в тесте RSpec для API

Я создаю веб-сервер RESTful, используя Goliath-Grape и используя RSpec для TDD. Когда я делаю вызов API PUT (/api/v1/users/:id) для обновления существующей записи из браузера, я получаю ожидаемый ответ 204.

Но когда я тестирую тот же вызов API через RSpec, я получаю 405. И заголовок ответа выглядит так:

PUT /api/v1/users/:id
{"ALLOW"=>"OPTIONS, POST, GET, HEAD", "CONTENT_TYPE"=>"text/plain", "CONTENT_LENGTH"=>"0", "SERVER"=>"Goliath", "DATE"=>"Fri, 09 Aug 2013 01:37:09 GMT"}

Фрагмент кода из api_spec.rb

describe "PUT /api/v1/users/:id" do
  it "update a user and return 204" do
    with_api(Application, api_options) do
      put_request(:path => "/api/v1/users/#{user_id}", :body => '{"user": {"email": "[email protected]"}', :head => {'Content-Type' => 'application/json'}) do |c|
        # .....
      end
    end
  end
end

Фрагмент кода для метода обновления:

# Update
put "/:id" do
  if User.where(_id: params['id']).exists?
    User.where(_id: params['id']).update(params['user'])
    status(204)
  else
    error! "Bad Request", 400
  end
end

Любая идея, почему это ломается в тесте RSpec.

Спасибо


person kobra    schedule 09.08.2013    source источник
comment
вы можете использовать представление сети браузера (скажем, в Chrome), чтобы увидеть, как запрос из браузера отличается от запроса вашего теста.   -  person akonsu    schedule 09.08.2013
comment
405 означает, что метод недоступен, а PUT не указан в ответе. Как выглядит определение ресурса Grape? Как вы делаете вызов из браузера (большинство браузеров не поддерживают PUT напрямую, поэтому вы используете консоль javascript или фреймворк, например jQuery - если да, то какая тестовая команда работает?)   -  person Neil Slater    schedule 09.08.2013
comment
Спасибо, Нил. Я добавил код для своего метода обновления и использую Postman (подключаемый модуль Google Chrome) для отправки запроса PUT (chrome.google.com/webstore/detail/postman-rest-client/).   -  person kobra    schedule 12.08.2013


Ответы (1)


пожалуйста, проверьте:

use Goliath::Rack::Validation::RequestMethod, %w(GET POST PUT DELETE)
person blackanger    schedule 25.04.2014