在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'} 

有任何想法吗? 谢谢!

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

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

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

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

很多挫折和变化,这对我有用。 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" 

首先,您不希望测试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 = "Test Name 1Some data for testing" 

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

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

现在这与设置@env ; 它只是有点漂亮。

我发现测试这些东西的最好方法是进行请求测试。 请求测试通过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 

我认为您可以使用headers参数指定headers

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

遵循Rspec文档, 了解如何提供JSON数据 。

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

或传递请求

"CONTENT_TYPE" => "application/json"