如何在RSpec控制器测试中伪造HTTP_ACCEPT_LANGUAGE?

时间:2014-02-12 12:29:19

标签: ruby-on-rails ruby rspec http-accept-language

我最近在before_action中的ApplicationController添加了一些新代码:

class ApplicationController < ActionController::Base

  before_action :set_locale

  def set_locale
    I18n.locale = (session[:locale] || params[:locale] || extract_locale_from_accept_language_header).to_s.downcase.presence || I18n.default_locale
  end

  private

  def extract_locale_from_accept_language_header
    request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first
  end

end

问题是extract_locale_from_accept_language_header功能会破坏我的所有控制器规格(即它们现在都失败了)。似乎RSpec无法检测到任何HTTP_ACCEPT_LANGUAGE

有没有办法伪造我的所有控制器规范的这种行为?

以下 工作但有点难看,因为我必须在我的所有控制器测试中添加行request.env...。而且我有很多。

require 'spec_helper'

describe UsersController do

  before :each do
    @user = FactoryGirl.create(:user)
    request.env['HTTP_ACCEPT_LANGUAGE'] = "en" # ugly
  end

  ...

end

有人可以帮忙吗?

感谢。

1 个答案:

答案 0 :(得分:4)

在spec_helper中执行此操作:

config.before :each, type: :controller do
  request.env['HTTP_ACCEPT_LANGUAGE'] = "en"
end

尝试使用控制器和功能规格:

config.before(:each) do |example|
  if [:controller, :feature].include?(example.metadata[:type])
    request.env['HTTP_ACCEPT_LANGUAGE'] = "en" # ugly
  end
end