【问题标题】:PUT method return 405 in RSpec test for APIPUT 方法在 API 的 RSpec 测试中返回 405
【发布时间】:2013-08-09 02:05:33
【问题描述】:

我正在使用 Goliath-Grape 构建 RESTful Web 服务器,并将 RSpec 用于 TDD。当进行 API PUT 调用 (/api/v1/users/:id) 以从浏览器更新现有记录时,我得到了预期的 204 响应。

但是当我通过 RSpec 测试相同的 API 调用时,我得到了 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 的代码 sn-p

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": "test_again@example.com"}', :head => {'Content-Type' => 'application/json'}) do |c|
        # .....
      end
    end
  end
end

更新方法的代码sn-p:

# 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 测试中中断。

谢谢

【问题讨论】:

  • 您可以使用浏览器的网络视图(例如,在 Chrome 中)查看来自浏览器的请求与您的测试请求有何不同。
  • 405 是方法不可用,PUT 未在响应中列出。 Grape 资源定义是什么样的?您如何从浏览器进行调用(大多数浏览器不直接支持 PUT,所以您使用的是 javascript 控制台或框架,例如 jQuery - 如果是,那么有效的测试命令是什么?)
  • 谢谢尼尔。我已经为我的更新方法添加了代码,并且我正在使用 Postman(Google Chrome 插件)发出 PUT 请求(chrome.google.com/webstore/detail/postman-rest-client/…)。

标签: ruby rspec grape goliath


【解决方案1】:

请检查:

use Goliath::Rack::Validation::RequestMethod, %w(GET POST PUT DELETE)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 2012-08-29
    相关资源
    最近更新 更多