web-dev-qa-db-ja.com

rspecでコンテンツタイプを指定する

POSTを介してJSON(またはXML)を送信するrspecテストを構築しようとしています。しかし、私は実際にそれを機能させることができないようです:

    json = {.... data ....}.to_json
    post '/model1.json',json,{'CONTENT_TYPE'=>'application/json'}

この

    json = {.... data ....}.to_json
    post '/model1.json',json,{'Content-Type'=>'application/json'}

何か案は?ありがとう!

22
skeevis

このスレッド で説明されているこれを行う方法があります-それはハックですが、うまくいくようです:

@request.env["HTTP_ACCEPT"] = "application/json"
json = { ... data ... }.to_json
post :create, :some_param => json
18
zetetic

Rails 3では、ヘッダーと@request.envのものをスキップして、ポストコールにformatパラメーターを追加するだけです。例:

post :create, format: :json, param: 'Value of Param'
17
Joe Hankin

多くの欲求不満とバリエーションがあり、それが私にとってうまくいったことです。 Rails 3.2.12 Rspec 2.1

 @request.env["HTTP_ACCEPT"] = "application/json"
 @request.env["CONTENT_TYPE"] = "application/json"
 put :update, :id => 1, "email" => "[email protected]"
10
VelLes

まず第一に、jsonからハッシュへの組み込みの変換をテストしたくありません。同じことが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

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>"
5
oma

もう少し洗練されたテストは、ヘッダーヘルパーを使用することです。

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

これで、@envの設定とまったく同じことが行われます。少しきれいです。

2
Craig Stuntz

headersparamでヘッダーを指定できると思います。

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

JSONデータを提供する方法 のRspecドキュメントに従います。

0
valdeci
@request.env["CONTENT_TYPE"] = "application/json"

またはリクエストを渡す

"CONTENT_TYPE" => "application/json"

0
raman rayat

これらをテストするために私が見つけた最良の方法は、リクエストテストを使用することです。リクエストテストは、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
0
mmmries