1

我是 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

就以下方面而言,使其工作的最佳方法是什么:

  • 让路线匹配?
  • 再次签入和签出用户以绕过 before(:each) 块的影响的 hackishness?
  • 整体做法?
4

1 回答 1

3

让控制器测试/规范正确设置语言环境的问题是一个长期存在的问题,请参阅:如何为功能测试设置语言环境 default_url_options (Rails)

从您所写的内容来看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),我真的建议使用上下文块分离案例,一个上下文没有 before 过滤器登录用户,另一个上下文使用 before 块登录用户。你有正确的设置现在对于试图查看发生了什么的人来说真的很困惑。

于 2012-09-13T21:21:49.480 回答