我的产品控制器上有一个前置过滤器:
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>
。 。 。这意味着我的测试在请求时没有登录。
我在这里缺少什么?
有没有更好的方法来应对这种情况?
答案 0 :(得分:5)
考虑到您正在测试控制器,并尝试将其集中在控制器上,您可以使用真实用户或模拟来存储current_user
方法。
before(:each) do
ApplicationController.any_instance.stub(:current_user).and_return(@user = mock('user'))
end
通过这种方式,您可以访问user
模拟以在需要时应用更多期望和存根。
如果模拟阻碍了,请将其更改为真正的User
对象。