Ответ 1
Есть способ сделать это, описанный в этой теме - это взломать, но он работает:
@request.env["HTTP_ACCEPT"] = "application/json"
json = { ... data ... }.to_json
post :create, :some_param => json
Я пытаюсь построить rspec-тест, который отправляет JSON (или XML) через POST. Однако я не могу заставить его работать:
json = {.... data ....}.to_json
post '/model1.json',json,{'CONTENT_TYPE'=>'application/json'}
и этот
json = {.... data ....}.to_json
post '/model1.json',json,{'Content-Type'=>'application/json'}
любые идеи? СПАСИБО!
Есть способ сделать это, описанный в этой теме - это взломать, но он работает:
@request.env["HTTP_ACCEPT"] = "application/json"
json = { ... data ... }.to_json
post :create, :some_param => json
В Rails 3 вы можете пропустить заголовок и материал @request.env
и просто добавить параметр format
к вашему сообщению, например:
post :create, format: :json, param: 'Value of Param'
Много разочарований и вариаций, и то, что сработало для меня. Rails 3.2.12 Rspec 2.10
@request.env["HTTP_ACCEPT"] = "application/json"
@request.env["CONTENT_TYPE"] = "application/json"
put :update, :id => 1, "email" => "[email protected]"
Прежде всего, вы не хотите проверять встроенное преобразование json в хеш. То же самое относится к xml.
Вы тестируете контроллер с данными как хэши, не беспокоя его json, xml или из html-формы.
Но если вы хотите сделать это как упражнение, это отдельный рубин script, чтобы играть с:)
require 'json'
url = URI.parse('http://localhost:3030/mymodels.json')
request = Net::HTTP::Post.new(url.path)
request.content_type="application/json"
request.basic_auth('username', 'password') #if used, else comment out
hash = {:mymodel => {:name => "Test Name 1", :description => "some data for testing description"}}
request.body = hash.to_json
response = Net::HTTP.start(url.host, url.port) {|http| http.request(request)}
puts response
чтобы перейти на xml, используйте content_type="text/xml"
и
request.body = "<?xml version='1.0' encoding='UTF-8'?><somedata><name>Test Name 1</name><description>Some data for testing</description></somedata>"
Несколько более элегантный тест заключается в использовании помощника заголовка:
header "HTTP_ACCEPT", "application/json"
json = {.... data ....}.to_json
post '/model1.json', json
Теперь это делается точно так же, как установка @env
; это немного красивее.
Лучший способ, который я нашел, чтобы проверить эти вещи, - это тестирование запросов. Тестирование запроса проходит через полные парады синтаксического анализа и маршрутизации Rails. Поэтому я могу написать тест следующим образом:
request_params = {:id => 1, :some_attribute => "some value"}
headers = {'Accept' => 'application/json', 'Content-Type' => 'application/json'}
put "/url/path", request_params.to_json, headers
expect(response).to be_success
Я думаю, что вы можете указать заголовки с headers
param:
post '/model1.json', headers: {'Content-type': 'application/json'}
Следуя документации Rspec как предоставить данные JSON.
@request.env["CONTENT_TYPE"] = "application/json"
ИЛИ передать запрос
"CONTENT_TYPE" => "application/json"