【问题标题】:How to set request headers in rspec request spec?如何在 rspec 请求规范中设置请求标头?
【发布时间】:2012-03-28 02:36:19
【问题描述】:

在控制器规范中,我可以像这样设置 http 接受标头:

request.accept = "application/json"

但在请求规范中,“请求”对象为零。那么我在这里怎么做呢?

我想将http接受标头设置为json的原因是我可以这样做:

get '/my/path'

而不是这个

get '/my/path.json'

【问题讨论】:

    标签: ruby-on-rails json testing rspec


    【解决方案1】:

    尝试类似:

    get :index, :format => 'json' 
    

    【讨论】:

    • 不确定,但可能有效,因为 rails 正在为该路线寻找 .format;这也对我有用。
    • 如果有人想知道,这只是将format=json 添加为查询参数。与标题字段不同。
    【解决方案2】:

    您应该能够将 HTTP 标头指定为 get() 方法的第三个参数,如下所述:

    http://api.rubyonrails.org/classes/ActionDispatch/Integration/RequestHelpers.html#method-i-get

    这里

    http://api.rubyonrails.org/classes/ActionDispatch/Integration/Session.html#method-i-process

    所以,你可以试试这样的:

    get '/my/path', nil, {'HTTP_ACCEPT' => "application/json"}
    

    【讨论】:

    • 我们需要使用“HTTP_ACCEPT”:get '/my/path', nil, {'HTTP_ACCEPT' => "application/json"}
    • 注意:这是用于集成测试,类似于下面的注释,在 rspec-rails 控制器测试中,您可以使用:request.env["HTTP_ACCEPT"] =
    • 我遇到的小问题是因为我很傻:标题键必须是字符串。符号不会显示。
    • @ajmurmann 现在符号可以工作了:“授权”标头可以是 :authorization
    • 新的 RSspec 3 语法类似于 get my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" } `
    【解决方案3】:

    我在 Test::Unit: 中使用过这个

    @request.env['HTTP_ACCEPT'] = "*/*, application/youtube-client"
    get :index
    

    【讨论】:

    • 同样,正如 Alex Soto 在对另一个答案的评论中指出的那样,在 rspec-rails 控制器测试中,您可以使用:request.env["HTTP_ACCEPT"]
    • 非常感谢老兄,唯一一个对我有用 ActionController::TestCase 的旧 2.3 应用程序的示例
    • +1 我尝试在标题哈希中使用名为 Cookie 的键(因为这是我的浏览器发送的),但它没有用。然后我做了request.keys 并看到了一个名为HTTP_COOKIE 的键。使用它有效。他们真的应该更好地记录这一点。
    • 真的有效!我还在github.com/rspec/rspec-rails/issues/65 中找到了答案
    • @Sytse Sijbrandij 没有人询问 Test::Unit。关于 rspec 的问题。
    【解决方案4】:

    这适用于控制器规格,而不是请求规格:

    request.headers["My Header"] = "something"
    

    【讨论】:

    • 这对我有用,这取决于您如何检索标题,如果您使用的是request.headersrequest.env
    • 注意:这是针对控制器测试,而不是问题中提到的集成测试。
    • 不适用于集成测试。但是,适用于控制器测试。
    【解决方案5】:

    您的问题已经得到解答,但如果您想将某些内容发布到另一个操作,您必须这样做:

    post :save, {format: :json, application: {param1: "test", param2: "test"}}
    

    【讨论】:

      【解决方案6】:

      我必须单独设置标题

      request.headers["Accept"] = "application/json"
      

      尝试通过 get/delete/.... 发送它在 rails4 中完全是垃圾,并导致我头疼,因为它从不作为标题发送,而是作为参数发送。

      {"Accept" => "application/json"}
      

      【讨论】:

      • 这真的能回答 OP 问题吗?如果是一个新问题,最好提出一个新问题。
      【解决方案7】:

      将 rspec 与 Rack::Test::Methods 一起使用

      header 'X_YOUR_HEADER_VAR', 'val'
      get '/path'
      

      标头 var 将以 X-Your-Header-Var 的形式出现

      【讨论】:

      • 注意:这是给Test::Unit的,不是给RSpec的。
      • 表示 rspec
      • 是的。在 rspec 中,它会为我引发 ndefined method 'header' 错误。
      【解决方案8】:

      要同时发送xhr: true 和标头,我必须这样做:

      my_headers = { "HTTP_ACCEPT": "application/json" }
      get my_path, xhr: true, headers: my_headers
      

      【讨论】:

      【解决方案9】:

      我在这里添加了这个,因为我在 Rails 5.1.rc1 中尝试这样做时遇到了很大的困难

      get 方法签名现在略有不同。

      你需要指定路径后面的选项作为关键字参数,即

      get /some/path, headers: {'ACCEPT' => 'application/json'}

      仅供参考,完整的关键字参数集是:

      params: {}, headers: {}, env: {}, xhr: false, as: :symbol

      【讨论】:

        【解决方案10】:

        使用 RSpec 3,您可以使用以下语法

        get my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" }
        

        in the official Rspec documentation 所述(链接指向 v3.7)

        【讨论】:

        • 甜蜜。正是我想要的。谢谢!
        • 在控制器规范中不起作用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-26
        • 1970-01-01
        相关资源
        最近更新 更多