如何将部分会话存根以模拟授权会话?

时间:2012-12-03 00:29:21

标签: ruby-on-rails-3 rspec ruby-on-rails-3.2 stub

我的产品控制器上有一个前置过滤器:

before_filter :authorize, only: [:create, :edit, :update]

我的authorize方法在我的application_controller中定义为:

def authorize
    redirect_to login_url, alert: "Not authorized" if current_user.nil?
end

和current_user定义为:

def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
end

在我的rspec中,我正在尝试:

before(:each) do
    session.stub!(:user_id).and_return("admin@email.com")
end

但我仍然收到如下错误:

ProductsController PUT update with valid params redirects to the product
     Failure/Error: response.should redirect_to(product)
       Expected response to be a redirect to <http://test.host/products/1> but was a redirect to <http://test.host/login>

。 。 。这意味着我的测试在请求时没有登录。

我在这里缺少什么?

有没有更好的方法来应对这种情况?

1 个答案:

答案 0 :(得分:5)

考虑到您正在测试控制器,并尝试将其集中在控制器上,您可以使用真实用户或模拟来存储current_user方法。

before(:each) do
   ApplicationController.any_instance.stub(:current_user).and_return(@user = mock('user'))
end

通过这种方式,您可以访问user模拟以在需要时应用更多期望和存根。 如果模拟阻碍了,请将其更改为真正的User对象。