gpt4 book ai didi

ruby-on-rails - Minitest 测试因 Rails 4.2 中的自定义 HTTP header 而失败

转载 作者:行者123 更新时间:2023-12-04 17:46:33 27 4
gpt4 key购买 nike

我无法使用 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

以及相应的 Controller :
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})(?:[-|_](?:[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 header 变量,并且一切都落入默认语言环境:
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-LanguageHTTP_ACCEPT_LANGUAGE ,该测试然后通过。

根据 Rails documentation ,我的测试应该有效。我用谷歌搜索了这个问题的几种不同方式来寻找答案,但结果是空的。 Stack Overflow 上有一些与此类似的问题,但这些问题的答案或建议都没有解决我的问题。

我错过了什么?

环境:
  • Mac OS X 10.11.1
  • ruby 2.2.2
  • rails 4.2.4
  • 迷你测试 5.8.0
  • 最佳答案

    Rails 设置了 request.env自定义 HTTP header 的变量:

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

  • 所以你可以设置 request.headers["Accept-Language"]在测试中,并使用 request.env["HTTP_ACCEPT_LANGUAGE"] 访问该值在 Controller 中。同样,您设置 request.headers["CloudFront-Viewer-Country"]在测试中,并使用 request.env["HTTP_CLOUDFRONT_VIEWER_COUNTRY"] 访问该值在 Controller 中。

    关于ruby-on-rails - Minitest 测试因 Rails 4.2 中的自定义 HTTP header 而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32836985/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com