Ruby on rails 测试具有不同主体和查询字符串参数的控制器

Ruby on rails 测试具有不同主体和查询字符串参数的控制器,ruby-on-rails,rspec,ruby-on-rails-5,Ruby On Rails,Rspec,Ruby On Rails 5,我想使用RSpec a控制器测试接收此类请求: curl -X POST \ --data "{\"same_key\": \"value_in_body\"}" \ --header "same_key: value_in_header" \ "http://localhost:5000/articles/?same_key=value_in_querystring" 具有: 车身中的相同\

我想使用RSpec a控制器测试接收此类请求:

curl -X POST                                   \
  --data   "{\"same_key\": \"value_in_body\"}" \
  --header "same_key: value_in_header"         \
  "http://localhost:5000/articles/?same_key=value_in_querystring"
具有:

  • 车身中的相同\u键
  • 标题中的相同\u键
  • 查询字符串中的相同\u键
地点:

  • 请求。请求参数[“相同的密钥”]
    “正文中的值”
  • request.headers[“same_key”]
    “value_in_header”
  • 请求。查询参数[“相同的密钥”]
    “查询字符串中的值”
我写了这个测试:

RSpec.describe ArticlesController, type: :controller do
  describe '#create' do
    it 'creates an article' do
      post :post,
        as:      :json,
        params:  { same_key: 'value_in_body' },
        headers: { same_key: 'value_in_header' }

      expect(response).to have_http_status(:created)
    end
  end
end
到目前为止,这对body参数和header参数都有好处


但是我们应该如何发送querystring参数呢?

如果您真的需要这种场景,您必须使用Rails URI模式,而不是只在post语句中指定操作名称

post '/documents/create_new_doc', params: {same_key: 'value_in_body'}

注意:从rake ROTES中获取准确的URI模式实际上不能同时拥有请求。在RSpec控制器测试或请求测试中,查询参数和请求参数。同时从post或Get函数中获取请求参数。另一个堆栈溢出回答解释了RSpec仅设置一个或另一个:

解决方案(由另一个答案提出)是使用IntegrationTests,a'la:

class CollectionTest“api\U密钥=我的api\U密钥”}
#这证明了控制器中的参数是单独识别的
#(您可以在控制器中以及在测试中测试此项):
放置request.POST.inspect
#=>{“集合”=>{“名称”=>“新集合”}
放置request.GET.inspect
#=>{“api\U密钥”=>“我的api\U密钥”}
结束
结束

我知道这一点。但是我们怎么做才能不覆盖body参数(因为两者都有相同的密钥)?是的,我明白你的意思,因为这是一个post请求。因此,您可以使用RUI模式,如“sessions/”,而不是使用操作名,您可以从rake路由获得它。RSpec的请求测试使用此模式。在RSpec控制器测试的上下文中,第一个参数必须是操作,而不是路径。@CirusPolis:您尝试过Rails URI模式吗?实际上railsrspec也应该允许url模式。不幸的是,它适用于请求规范(),但不适用于控制器规范()。