我目前正在构建一个由 Rails/rails-api 提供支持的 JSON API。我有一个路由,它通过 PATCH 请求和一个 before 过滤器接受 JSON 发送 需要访问原始请求/JSON .
出于测试目的,我在过滤器之前添加了以下内容以显示我的问题:
before_filter do
puts "Raw Post: #{request.raw_post.inspect}"
puts "Params: #{params.inspect}"
end
以下 curl 请求按预期工作:
curl -X PATCH -H "Content-Type: application/json" -d '{"key":"value"}' http://localhost:3000/update
# Raw Post: "{\"key\":\"value\"}"
# Params: {"key"=>"value", "action"=>"update", "controller"=>"posts"}
但是我未能测试此方法,以下调用均无效:
test 'passing hash' do
patch :update, { key: "value" }
end
# Raw Post: "key=value"
# Params: {"key"=>"value", "controller"=>"posts", "action"=>"update"}
test 'passing hash, setting the format' do
patch :update, { key: "value" }, format: :json
end
# Raw Post: "key=value"
# Params: {"key"=>"value", "controller"=>"posts", "action"=>"update", "format"=>"json"}
test 'passing JSON' do
patch :update, { key: "value" }.to_json
end
# Raw Post: "{\"key\":\"value\"}"
# Params: {"controller"=>"posts", "action"=>"update"}
test 'passing JSON, setting format' do
patch :update, { key: "value" }.to_json, format: :json
end
# Raw Post: "{\"key\":\"value\"}"
# Params: {"format"=>"json", "controller"=>"posts", "action"=>"update"}
这个列表更长,我只是想告诉你我的问题。我测试了设置
Accept
和 Content-Type
标题到 application/json
同样,似乎没有任何帮助。我做错了什么,或者这是 Rails 功能测试中的错误?
最佳答案
这是 a bug ,由该问题的同一作者报告。在 Rails 5 之前它不太可能被修复,或者通过查看它被分配到的里程碑似乎是这样。
如果你和我一样,在处理这个问题几个小时后不知道它真的是一个错误,也许你想知道你可以在集成测试中做到这一点:$ rails g integration_test my_integration_test
require 'test_helper'
class MyIntegrationTestTest < ActionDispatch::IntegrationTest
setup do
@owner = Owner.create(name: 'My name')
@json = { name: 'name', value: 'My new name' }.to_json
end
test "update owner passing json" do
patch "/owners/#{@owner.id}",
@json,
{ 'Accept' => Mime::JSON, 'Content-Type' => Mime::JSON.to_s}
assert_response :success
assert_equal 'application/json', response.headers['Content-Type']
assert_not_nil assigns :owner
assert_equal 'My new name', assigns(:owner).name
end
end
关于ruby-on-rails - JSON Rails API 的功能测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20327627/