Я использую 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: 'test@testreg.co'
}.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: 'test@testreg.co'
}
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