3

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

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>

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

我在这里想念什么?

有没有更好的方法来处理这种情况?

4

1 回答 1

5

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

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

有了它,您将可以访问user模拟以在需要时应用进一步的期望和存根。如果模型妨碍了,请将其更改为真实User对象。

于 2012-12-03T11:43:13.983 回答