在 rspec 中指定内容类型

问题描述 投票:0回答:9

我正在尝试构建一个通过 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'}

有什么想法吗?谢谢!

ruby rspec sinatra rack
9个回答
20
投票

在 Rails 3 中,您可以跳过标题和

@request.env
内容,只需在 post 调用中添加
format
参数,例如:

post :create, format: :json, param: 'Value of Param'

18
投票

这个线程中描述了一种方法可以做到这一点——这是一个黑客,但它似乎有效:

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

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" => "[email protected]"

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

要切换到 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
投票

一个稍微优雅的测试是使用标题助手:

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

现在这与设置

@env
的作用完全相同;只是比较漂亮一点而已。


1
投票

我发现测试这些东西的最好方法是使用请求测试。请求测试经历 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
投票

我认为您可以使用

headers
param:

指定标题
post '/model1.json', headers: {'Content-type': 'application/json'}

遵循 Rspec 文档如何提供 JSON 数据


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

或传入请求

"CONTENT_TYPE" => "application/json"


0
投票
post '/model1.json', {.... data ....}, as: :json
© www.soinside.com 2019 - 2024. All rights reserved.