我不能用我的jsonapi-resources Rails 5.1API测试POST请求。Rails似乎不允许我定制请求内容类型,也不允许我这样做。
jsonapi-resources版本0.9.0,边缘Rails (我认为它是5.2 beta2)
因此,这个IntegrationTest代码:
require 'test_helper'
class EventsControllerTest < ActionDispatch::IntegrationTest
setup do
@event = events(:one)
end
test 'should get index' do
get events_url, as: 'application/vnd.api+json'
assert_response :success
end
test 'should create event' do
assert_difference('Event.count') do
post events_url, params: {
data: {
type: 'events',
attributes: {
name: @event.name,
body: @event.body
}
}
},
as: :api_json
end
assert_response 201
end
end...produces此错误:
$ bin/rails test
...
Failure:
EventsControllerTest#test_should_create_event [/Users/aljabear/Projects/visualist/test/controllers/events_controller_test.rb:26]:
...GET请求运行良好。邮寄请求已被登入。在POST请求之后打印出@request.body给出了以下提示:
{
"errors":[
{"title":"Bad Request",
"detail":"765: unexpected token at 'data[type]=events\u0026data[attributes][name]=Book+1\u0026data[attributes][body]=This+is+body+text.'",
"code":"400",
"status":"400"
}
]
}因此,很明显,Rails并不尊重:api_json内容类型;我猜它是在吐出编码的URL表单。
如果我这样做,然后打印结果:
...
as: :json,
headers: {
'Content-type': 'application/vnd.api+json',
}
...我得到以下信息,显示jsonapi-resources运行正常(只是非常严格);当我使用as: :json时,Rails正确地将事物格式化为json,而不是当我执行:api_json时。
{
"errors":[{
"title":"Not acceptable",
"detail":"All requests must use the 'application/vnd.api+json' Accept without media type parameters. This request specified 'application/json'.",
"code":"406",
"status":"406"
}]
}Rails只是不打扰按要求转换MIME类型吗?或者这仅仅是一个序列化问题?我怎么能强迫它这么做呢?谢谢..。任何线索都欢迎。
发布于 2018-01-28 11:38:45
我成功地使用了如下代码:
test 'should create event' do
assert_difference('Event.count') do
post events_url, params: {
data: {
type: 'events',
attributes: {
name: @event.name,
body: @event.body
}
}
},
as: :json,
headers: {
'Accept' => JSONAPI::MEDIA_TYPE,
'Content-Type' => JSONAPI::MEDIA_TYPE
}
end
assert_response :created
end我在GitHub上有一个项目,您可以查看它来查看我的代码。
发布于 2018-01-14 22:51:57
Rails只是不打扰按要求转换MIME类型吗?或者这仅仅是一个序列化问题?我怎么能强迫它这么做呢?
tl;dr:是,是和as_json :)
测试是rails功能的子集--它们不会通过完整的rails堆栈(因此不会基于MIME类型进行转换)。
是的,我想你需要序列化它,这样rails才能不序列化它.
Try running `as_json` on your data... eg
test 'should create event' do
assert_difference('Event.count') do
post events_url, params: {
data: {
type: 'events',
attributes: {
name: @event.name,
body: @event.body
}
}.as_json
},
as: :api_json
end
assert_response 201
end或类似于你的实际数据..。伊..。如果你让Rails期待json..。然后把它递给我吗?
https://stackoverflow.com/questions/48236986
复制相似问题