我是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
在以下方面实现这一目标的最佳方法是什么:
答案 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,我真的建议使用上下文块来分离这些案例,其中一个上下文没有使用前一个过滤器来记录用户,另一个使用上一个块记录用户。现在的设置对于试图查看正在进行的操作的人来说真的很困惑。