2012-09-13 34 views
1

我是新来RSpec,并试图编写一个简单的测试,显示设计工作。我选择了一个随机页面,并希望编写一个测试,显示未登录的用户被重定向到/ users/sign_in。基本设计规范与I18N

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 

是什么方面得到这个工作的最佳方式:

  • 让路线匹配?
  • 为了避免before(:each)块的影响,再次签署用户的hackish?
  • 总体方法?

回答

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块来记录用户进来。你有权利的设置现在对于试图看看发生了什么的人来说真的很困惑。

+0

Shioyama - 这工作完美!非常感谢。我把这个补丁放在config/initializers中的一个新文件中(根据http://stackoverflow.com/questions/3420680/monkey-patching-in-rails-3)。让我知道你是否会以不同的方式应用它。 –

+0

嗨,很高兴它解决了!我在spec/support /中为它创建了一个文件,然后从features/support/custom_env.rb中获取该文件,以便它也可以应用于黄瓜测试。但基本上你可以把它放在任何可以通过rspec加载的地方。关于config/initializers的唯一的事情是这些文件也将以其他模式加载,除非你在某些条件下包装它。我更喜欢将测试相关的东西分开。 –