在rspec中指定内容类型

时间:2010-10-27 19:09:10

标签: ruby rspec sinatra rack

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

任何想法?谢谢!

8 个答案:

答案 0 :(得分:18)

有一种方法可以在this thread中描述 - 这是一个黑客,但似乎有效:

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

答案 1 :(得分:16)

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

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

答案 2 :(得分: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"

答案 3 :(得分: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>"

答案 4 :(得分:2)

稍微优雅的测试是使用标头帮助器:

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

现在这与设置@env完全相同;它有点漂亮。

答案 5 :(得分:0)

我发现测试这些东西的最好方法是进行请求测试。请求测试通过Rails的完整param解析和路由阶段。所以我可以写一个这样的测试:

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

答案 6 :(得分:0)

我认为您可以使用if (lastId != end_time_id) { for (var i = lastId + 1; i <= end_time_id; i++) { $('#trTimeslot' + i).hide(); } } param指定标头:

headers

遵循how provide JSON data的Rspec文档。

答案 7 :(得分:0)

rails

或传递请求

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