【问题标题】:Rails 5 API integration tests don't work with jsonapi-resourcesRails 5 API 集成测试不适用于 jsonapi-resources
【发布时间】:2018-06-22 13:10:36
【问题描述】:

我无法针对我的jsonapi-resources Rails 5.1 API 测试 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

...产生此错误:

$ 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"
    }
 ]
}

所以,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 类型?或者这只是一个序列化问题?我怎样才能强迫它这样做?谢谢...欢迎提供任何线索。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-5 minitest json-api jsonapi-resources


    【解决方案1】:

    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...然后将它传递给 json? :D

    【讨论】:

      【解决方案2】:

      我正在成功使用如下代码:

      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 上有一个项目,您可以查看我的代码。

      【讨论】:

      • 给你投票,虽然我自己没有测试过;我转而使用Fast JsonAPI
      猜你喜欢
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-05
      • 2016-05-03
      • 2022-01-08
      • 2020-03-16
      • 1970-01-01
      相关资源
      最近更新 更多