加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 最小的测试在Rails 4.2中使用自定义HTTP头失败

发布时间:2020-12-17 02:48:50 所属栏目:百科 来源:网络整理
导读:我无法使用minitest在我的Rails 4.2应用程序中成功测试自定义HTTP变量 – 出于某种原因,Rails似乎根本不识别它们. 我有以下测试: require "test_helper"describe ApplicationController do tests HomeController before do cookies[:locale] = "ru" request
我无法使用minitest在我的Rails 4.2应用程序中成功测试自定义HTTP变量 – 出于某种原因,Rails似乎根本不识别它们.

我有以下测试:

require "test_helper"

describe ApplicationController do
  tests HomeController

  before do
    cookies[:locale] = "ru"
    request.headers["Accept-Language"] = "zh-cn,en-us"
    request.headers["CloudFront-Viewer-Country"] = "FR"
    I18n.default_locale = :en
  end

  it "sets locale from URL params first" do
    get :index,locale: "de"
    I18n.locale.must_equal :de
  end

  it "sets locale from a cookie second" do
    get :index
    I18n.locale.must_equal :ru
  end

  it "sets locale from Accept-Language header third" do
    cookies.delete :locale
    get :index
    I18n.locale.must_equal :"zh-CN"
  end

  it "sets locale from CloudFront-Viewer-Country header last" do
    cookies.delete :locale
    request.headers["Accept-Language"] = nil
    get :index
    I18n.locale.must_equal :fr
  end
end

和相应的控制器:

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs,you may want to use :null_session instead.
  protect_from_forgery with: :exception

  before_filter :set_locale

  def default_url_options(options = {})
    { locale: I18n.locale }.merge options
  end

  private

  def set_locale
    I18n.locale = params[:locale] ||
                  cookies[:locale] ||
                  extract_locale_from_accept_language_header ||
                  set_locale_from_cloudfront_viewer_country ||
                  I18n.default_locale

    unless request.fullpath =~ /^/(?:[a-z]{2,2})(?:[-|_](?:[A-Z]{2,2}))?/
      redirect_to %(#{request.protocol}#{request.host}/#{I18n.locale}#{request.fullpath unless request.fullpath == "/"}),status: :found
    end
  end

  def extract_locale_from_accept_language_header
    if request.env["Accept-Language"]
      request.env["Accept-Language"].scan(/(?:[a-z]{2,2}))?/i).first
    end
  end

  def set_locale_from_cloudfront_viewer_country
    case request.env["CloudFront-Viewer-Country"]
    when "FR"
      return :fr
    else
      return I18n.default_locale
    end
  end
end

最后两个测试失败,因为Rails似乎没有识别我设置的HTTP头变量,一切都落到了默认的语言环境:

Failure:
ApplicationController#test_0004_sets locale from CloudFront-Viewer-Country header last [/Users/aporter/Developer/com/wavetronix/www/test/controllers/application_controller_test.rb:33]
Minitest::Assertion: Expected: :fr
  Actual: :en

Failure:
ApplicationController#test_0003_sets locale from Accept-Language header third [/Users/aporter/Developer/com/wavetronix/www/test/controllers/application_controller_test.rb:26]
Minitest::Assertion: Expected: :"zh-CN"
  Actual: :en

如果我将Accept-Language更改为HTTP_ACCEPT_LANGUAGE,那么该测试将通过.

根据Rails documentation,我的测试应该有效.我用几种不同的方式搜索这个问题寻找答案然后空洞. Stack Overflow上有一些与此类似的问题,但这些问题的答案和建议都没有解决我的问题.

我错过了什么?

环境:

> Mac OS X 10.11.1
> Ruby 2.2.2
> Rails 4.2.4
> minitest 5.8.0

解决方法

Rails通过以下方式为自定义HTTP标头设置request.env变量:

>将标题转换为全部大写
>用下划线替换破折号
>前缀“HTTP_”

因此,您可以在测试中设置request.headers [“Accept-Language”],并使用控制器中的request.env [“HTTP_ACCEPT_LANGUAGE”]访问该值.同样,您在测试中设置request.headers [“CloudFront-Viewer-Country”],并使用控制器中的request.env [“HTTP_CLOUDFRONT_VIEWER_COUNTRY”]访问该值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读