在rspec中指定内容类型

ske*_*vis 22 ruby rack rspec sinatra

我正在尝试构建一个通过POST发送JSON(或XML)的rspec测试.但是,我似乎无法让它真正起作用:

    json = {.... data ....}.to_json
    post '/model1.json',json,{'CONTENT_TYPE'=>'application/json'}
Run Code Online (Sandbox Code Playgroud)

还有这个

    json = {.... data ....}.to_json
    post '/model1.json',json,{'Content-Type'=>'application/json'}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?谢谢!

zet*_*tic 18

有一种方法可以在这个线程中描述- 这是一个黑客,但它似乎工作:

@request.env["HTTP_ACCEPT"] = "application/json"
json = { ... data ... }.to_json
post :create, :some_param => json
Run Code Online (Sandbox Code Playgroud)

  • 这适用于Rspec 2和rails 3.(并且极难找到)实际上,我不得不在事物上使用.to_json来使其正常运行.否则,其他一切工作正常. (3认同)

Joe*_*kin 17

在Rails 3中,您可以跳过标题和@request.env内容,只需format在帖子调用中添加一个参数,例如:

post :create, format: :json, param: 'Value of Param'
Run Code Online (Sandbox Code Playgroud)

  • 看起来在rails/rspec的更高版本中,`format :: json`变为`as :: json` (3认同)

Vel*_*Les 10

很多挫折和变化,这对我有用. Rails 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"
Run Code Online (Sandbox Code Playgroud)


oma*_*oma 5

首先,您不希望测试json到hash的内置转换.同样适用于xml.

你用数据作为哈希测试控制器,而不是打扰它的json,xml或html表单.

但是如果你想做一个练习,这是一个独立的ruby脚本来玩:)

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
Run Code Online (Sandbox Code Playgroud)

切换到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>"
Run Code Online (Sandbox Code Playgroud)