Тестирование AJAX POST с использованием Rack::Test — как передать данные?

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

Мой тест выглядит так:

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, но это не имело значения.

есть идеи как это сделать?


person Dave Sag    schedule 10.09.2013    source источник


Ответы (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
person diminish    schedule 17.09.2013
comment
Интересный. В моем фактическом коде приложения переменная Sinatra params автоматически заполняется данными, поступающими из запроса AJAX, но когда данные отправляются из теста, я могу извлечь их, как вы рекомендуете, но params не заполняется. Действительно, когда я добавляю строку JSON.parse в свой код, я получаю JSON::ParserError. Это заставляет меня подозревать, что проблема связана с тем, как метод ajaxSubmit плагина jQuery forms отправляет данные. Кажется, моя ошибка все-таки не в тесте. Спасибо, что вы дали мне направление для дальнейшего изучения. - person Dave Sag; 18.09.2013

Итак, мое решение немного странное и специфичное для того, как я запускаю свой запрос JSON в первую очередь, а именно с помощью плагинов jQuery Validation и jQuery Forms на стороне клиента. jQuery Forms не объединяет поля формы в строковый хеш, как я ожидал, а отправляет поля формы через 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, а не к тому, как обычно тестируют отправку данных JSON через POST через AJAX. Надеюсь, это поможет другим.

person Dave Sag    schedule 18.09.2013
comment
Это необходимо? У меня сложилось впечатление, что если вы отбросите Content-Type и URI.encode_www_form, он автоматически обработает форму как JSON или Form-URL-Encoded. (Вы не упомянули здесь или в вопросе, пытались ли вы без третьего (т.е. хэш) аргумента post().) - person Rob Howard; 18.09.2013
comment
Спасибо @RobHoward, я изменил свои тесты, и вы правы. Я обновил свой ответ соответственно. Мне все еще нужен параметр HTTP_X_REQUESTED_WITH, чтобы сервер знал, что это AJAX. Ура Д - person Dave Sag; 19.09.2013
comment
СПАСИБО. Я пытался заставить тестовый пример работать, и он терпел неудачу, потому что я не мог понять, как заставить его отправить запрос xhr (в Padrino с Minitest, если это поможет). добавление заголовка HTTP_X_REQUESTED_WITH решило эту проблему! - person Oranges13; 09.02.2016