I18N的基本设计规范

时间:2012-09-13 20:36:20

标签: ruby-on-rails rspec devise

我是RSpec的新手,并尝试编写一个显示Devise正在运行的简单测试。我已经选择了一个随机页面,想要编写一个测试,显示未登录的用户被重定向到/ users / sign_in。

describe OrgsController do

  describe "GET index when not logged in" do
    it "redirects to new_user_session_path" do
      user = FactoryGirl.create(:user)
      user.confirm!
      sign_in user
      sign_out user
      get :index
      response.should redirect_to new_user_session_path
    end
  end

  before(:each) do
    user = FactoryGirl.create(:user)
    user.confirm!
    sign_in user
  end

  # remaining specs

end

我得到"Expected response to be a redirect to <http://test.host/users/sign_in?locale=en> but was a redirect to <http://test.host/users/sign_in>."

我已经实现了i18n,并且已经在我的应用程序控制器中了:

before_filter :set_i18n_locale_from_params

在以下方面实现这一目标的最佳方法是什么:

  • 让路线匹配?
  • 再次签约用户以解决之前(:每个)区块的影响的hackishness?
  • 整体方法?

1 个答案:

答案 0 :(得分:3)

获取控制器测试/规范以正确设置区域设置的问题是一个长期存在的问题,请参阅:How to set locale default_url_options for functional tests (Rails)

根据您的编写,get :index默认情况下未设置区域设置,因为default_url_options无法通过控制器测试/规范运行。尝试上面链接中提到的解决方案之一,以获得匹配的路由。另见关于github的讨论:https://github.com/rspec/rspec-rails/issues/255

对于它的价值,这是the patch我目前在规范/测试中使用以使区域设置自动传递到当前区域设置的路由:

class ActionDispatch::Routing::RouteSet
  def url_for_with_locale_fix(options)
    url_for_without_locale_fix(options.merge(:locale => I18n.locale))
  end

  alias_method_chain :url_for, :locale_fix
end

关于你所拥有的before(:each)块设置的hackish,我真的建议使用上下文块来分离这些案例,其中一个上下文没有使用前一个过滤器来记录用户,另一个使用上一个块记录用户。现在的设置对于试图查看正在进行的操作的人来说真的很困惑。