Указание типа контента в rspec - PullRequest
22 голосов
/ 27 октября 2010

Я пытаюсь создать тест 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'}

есть идеи? СПАСИБО!

Ответы [ 8 ]

18 голосов
/ 28 октября 2010

Есть способ сделать это, описанный в этой теме - это взлом, но, похоже, работает:

@request.env["HTTP_ACCEPT"] = "application/json"
json = { ... data ... }.to_json
post :create, :some_param => json
16 голосов
/ 14 сентября 2012

В Rails 3 вы можете пропустить заголовок и материал @request.env и просто добавить параметр format к вашему почтовому вызову, например:

post :create, format: :json, param: 'Value of Param'
10 голосов
/ 26 марта 2013

Много разочарований и различий, и это то, что сработало для меня. Рельсы 3.2.12 Rspec 2.10

 @request.env["HTTP_ACCEPT"] = "application/json"
 @request.env["CONTENT_TYPE"] = "application/json"
 put :update, :id => 1, "email" => "bing@test.com"
5 голосов
/ 10 ноября 2010

Прежде всего, вы не хотите тестировать встроенное преобразование json в хеш.То же относится и к XML.

Вы тестируете контроллер с данными в виде хэшей, не заботясь о том, являются ли они json, xml или html-формой.

Но если вы хотите сделать это в качестве упражнения, это автономный рубинскрипт для игры:)

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>"
2 голосов
/ 29 июня 2012

Немного более элегантный тест - использовать вспомогательный заголовок:

header "HTTP_ACCEPT", "application/json"
json = {.... data ....}.to_json
post '/model1.json', json

Теперь это точно так же, как установка @env; это немного красивее.

0 голосов
/ 31 октября 2017
@request.env["CONTENT_TYPE"] = "application/json"

ИЛИ передать запрос

"CONTENT_TYPE" => "application/json"

0 голосов
/ 27 июня 2017

Я думаю, что вы можете указать заголовки с headers param:

post '/model1.json', headers: {'Content-type': 'application/json'}

В соответствии с документацией Rspec как предоставить данные JSON .

0 голосов
/ 01 августа 2014

Лучший способ, который я нашел для проверки этих вещей, - это тестирование по запросу. Тесты запросов проходят этапы полного разбора параметров и маршрутизации 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
...