基本设计规范与国际化(Basic Devise spec with I18N)

2019-06-28 08:30发布

我是新来的RSpec,并尝试写一个简单的测试,显示设计工作。 我挑选一个随机的网页,并希望写一个测试表明,非登录用户重新重定向到/用户/ 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>."

我已经实现国际化,并在我的应用程序控制器:

before_filter :set_i18n_locale_from_params

是什么让在这方面工作的最佳方式:

  • 获取路线相匹配?
  • 在签约用户,并再次进行的hackishness获得一轮之前的效果(:每个)块?
  • 总的方针?

Answer 1:

越来越控制器测试/规格正确设置语言环境的问题是一个长期存在的一个,请参阅: 如何设置区域default_url_options功能测试(滑轨)

从你写的是什么,它看起来像get :index不设置默认的语言环境,因为default_url_options不会从控制器测试/规格工作。 试着在上面的链接获得的路由匹配提到的解决方案之一。 同时在Github上查看此讨论: https://github.com/rspec/rspec-rails/issues/255

对于它的价值,这是补丁我目前在规范/测试使用去自动传递给从当前区域航线的语言环境:

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

关于的的hackishness before(:each)你有块的设置,我真的建议使用上下文块分离的情况下,有一个上下文没有前过滤器登录用户,而另一个与前块登录用户。你现在所拥有的安装程序是真正令人困惑的人想看看发生了什么事情。



文章来源: Basic Devise spec with I18N