6

В настоящее время я создаю JSON API, работающий на Rails/rails-api. У меня есть маршрут, который принимает JSON-send через запрос PATCH и перед фильтром, который нуждается в доступе к необработанному запросу/JSON.Функциональное тестирование API JSON Rails

Для тестирования я добавил следующее перед фильтром, чтобы показать мою проблему:

before_filter do 
    puts "Raw Post: #{request.raw_post.inspect}" 
    puts "Params: #{params.inspect}" 
end 

Следующая локон запрос работает по назначению:

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

Однако я негоден этот метод, ни один из следующих звонков:

  • Params включены, но не как JSON переданы

    test 'passing hash' do 
        patch :update, { key: "value" } 
    end 
    
    # Raw Post: "key=value" 
    # Params: {"key"=>"value", "controller"=>"posts", "action"=>"update"} 
    
  • Params включен, но опять не как JSON переданы

    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"} 
    
  • формате JSON, но не включены в Params

    test 'passing JSON' do 
        patch :update, { key: "value" }.to_json 
    end 
    
    # Raw Post: "{\"key\":\"value\"}" 
    # Params: {"controller"=>"posts", "action"=>"update"} 
    
  • формат JSON, но не включенные в Params

    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?

ответ

6

Это 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 
+0

Я отмечу это как ответ, потому что это лучший способ обойти эту проблему. Извлеченный урок: не используйте функциональные тесты вообще, пройдите полные интеграционные тесты. –

Смежные вопросы