Rails 5 API 集成测试不适用于 jsonapi-resources
Rails 5 API integration tests don't work with jsonapi-resources
我无法针对我的 jsonapi-resources
Rails 5.1 API 测试 POST 请求。 Rails 似乎不允许我自定义请求内容类型,或者我做错了。
jsonapi-resources
版本 0.9.0,edge 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
...产生此错误:
$ bin/rails test
...
Failure:
EventsControllerTest#test_should_create_event [/Users/aljabear/Projects/visualist/test/controllers/events_controller_test.rb:26]:
...
GET 请求工作正常。 POST 请求被阻止了。在 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"
}
]
}
所以,显然 :api_json
内容类型没有被 Rails 尊重;
我想它不是吐出 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 类型吗?或者这只是一个序列化问题?我怎样才能强迫它这样做?谢谢...欢迎提供任何线索。
Is Rails just not bothering to convert the MIME type as requested? Or is this just a serialization issue? How can I force it to do it?
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... 然后传递它 json? :D
我成功地使用了如下代码:
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 上有一个项目,您可以查看我的代码。
我无法针对我的 jsonapi-resources
Rails 5.1 API 测试 POST 请求。 Rails 似乎不允许我自定义请求内容类型,或者我做错了。
jsonapi-resources
版本 0.9.0,edge 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
...产生此错误:
$ bin/rails test
...
Failure:
EventsControllerTest#test_should_create_event [/Users/aljabear/Projects/visualist/test/controllers/events_controller_test.rb:26]:
...
GET 请求工作正常。 POST 请求被阻止了。在 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"
}
]
}
所以,显然 :api_json
内容类型没有被 Rails 尊重;
我想它不是吐出 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 类型吗?或者这只是一个序列化问题?我怎样才能强迫它这样做?谢谢...欢迎提供任何线索。
Is Rails just not bothering to convert the MIME type as requested? Or is this just a serialization issue? How can I force it to do it?
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... 然后传递它 json? :D
我成功地使用了如下代码:
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 上有一个项目,您可以查看我的代码。