首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 5 API集成测试不适用于jsonapi资源。

Rails 5 API集成测试不适用于jsonapi资源。
EN

Stack Overflow用户
提问于 2018-01-13 04:44:37
回答 2查看 863关注 0票数 2

我不能用我的jsonapi-resources Rails 5.1API测试POST请求。Rails似乎不允许我定制请求内容类型,也不允许我这样做。

jsonapi-resources版本0.9.0,边缘Rails (我认为它是5.2 beta2)

因此,这个IntegrationTest代码:

代码语言:javascript
复制
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此错误:

代码语言:javascript
复制
$ bin/rails test
...

Failure:
EventsControllerTest#test_should_create_event [/Users/aljabear/Projects/visualist/test/controllers/events_controller_test.rb:26]:
...

GET请求运行良好。邮寄请求已被登入。在POST请求之后打印出@request.body给出了以下提示:

代码语言:javascript
复制
{
 "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表单。

如果我这样做,然后打印结果:

代码语言:javascript
复制
...
as: :json,
headers: {
  'Content-type': 'application/vnd.api+json',
}
...

我得到以下信息,显示jsonapi-resources运行正常(只是非常严格);当我使用as: :json时,Rails正确地将事物格式化为json,而不是当我执行:api_json时。

代码语言:javascript
复制
{
 "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类型吗?或者这仅仅是一个序列化问题?我怎么能强迫它这么做呢?谢谢..。任何线索都欢迎。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-28 11:38:45

我成功地使用了如下代码:

代码语言:javascript
复制
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上有一个项目,您可以查看它来查看我的代码。

票数 3
EN

Stack Overflow用户

发布于 2018-01-14 22:51:57

Rails只是不打扰按要求转换MIME类型吗?或者这仅仅是一个序列化问题?我怎么能强迫它这么做呢?

tl;dr:是,是和as_json :)

测试是rails功能的子集--它们不会通过完整的rails堆栈(因此不会基于MIME类型进行转换)。

是的,我想你需要序列化它,这样rails才能不序列化它.

代码语言:javascript
复制
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..。然后把它递给我吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48236986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档