Тестирование AJAX POST с помощью Rack:: Test - как передать данные?

Я использую Rack:: Test для тестирования своего приложения и вам нужно протестировать отправку данных через AJAX.

Мой тест выглядит следующим образом:

describe 'POST /user/' do
  include Rack::Test::Methods
  it 'must allow user registration with valid information' do
    post '/user', {
      username: 'test_reg',
      password: 'test_pass',
      email: '[email protected]'
    }.to_json, {"CONTENT_TYPE" => 'application/json', "HTTP_X_REQUESTED_WITH" => "XMLHttpRequest"}
    last_response.must_be :ok?
    last_response.body.must_match 'test_reg has been saved'
  end
end

Но на сервере он не получает POSTED-данные.

Я также пробовал просто пропустить хэш без параметров to_json, но это не имело значения.

Любая идея, как это сделать?

Ответ 1

Итак, мое решение немного странно и специфично для того, как я запускаю свой запрос JSON, в первую очередь, используя плагины jQuery Validation и jQuery Forms на стороне клиента. jQuery Forms не связывает поля формы с строгим Hash, как я и ожидал, но отправляет поля формы через AJAX, но в качестве классической строки кодированных символов URI. Поэтому, изменив мой тест на следующий, он теперь отлично работает.

describe 'POST /user/' do
  include Rack::Test::Methods
  it 'must allow user registration with valid information' do
    fields = {
      username: 'test_reg',
      password: 'test_pass',
      email: '[email protected]'
    }
    post '/user', fields, {"HTTP_X_REQUESTED_WITH" => "XMLHttpRequest"}
    last_response.must_be :ok?
    last_response.body.must_match 'test_reg has been saved'
  end
end

Конечно, это связано с тем, как работает плагин jQuery Forms, а вовсе не так, как обычно идет тестирование тестирования POSTing данных JSON через AJAX. Надеюсь, это поможет другим.

Ответ 2

Ваша конечная точка сообщения должна анализировать опубликованное тело JSON, которое, как я полагаю, вы уже делаете. Можете ли вы опубликовать, как работает конечная точка, а также номера версий стойки, стойки, рубинов и синатра? Просьба также указать, как вы проверяете, может ли сервер получать что-либо, а именно тестовый макет, путать ваше обнаружение.

    post '/user' do
       json_data = JSON.parse(request.body.read.to_s)
       # or # json_data = JSON.parse(request.env["rack.input"].read)
       ...
    end