2014-09-26 60 views
0

我正在使用Rails4和设计。在编写控制器规格时,我遇到了这样的代码:有人能解释一下这个RSpec存根是如何工作的吗?

user = double(@user) 
request.env['warden'].stub :authenticate! => user 
allow(controller).to receive(:current_user) { user } 

... here

它的工作原理。我写的控制器规范要求认证通过适当。

我读过一些关于存根工作原理的web条目,我想我明白了。似乎快速和足够我的需求。

即使上面的代码使用RSpec的double方法,我仍然得到这个折旧警告:

从RSpec的,嘲笑的老:should语法使用stub没有明确 使语法已过时。改为使用新的:expect语法或 明确启用:should。从 调用/Users/perry_mac/rails_projects/mymri/spec/controllers/steps_controller_spec.rb:14:in `block(2 levels)in'。

由于我使用“new:expect语法”,这使我感到困惑。所以我对这个其他工作的代码片断感到不知所措。例如,我现在还不清楚如何使用它来编写一个测试,该测试使用两个用户登录并确保每个用户都只能看到他们的适当范围的搜索结果。是否有更合适的方式来存根会话来检查使用身份验证的控制器?

而且......为什么上面的工作,但这样的事情不?:

before(:each) { 
email = "[email protected]" 
password= "password" 
@user = FactoryGirl.create(:user, email: email, password: password) 

session[:user_id] = @user.id 
. 
. 
. 

回答

0

显然,所有我需要的是:

@request.env["devise.mapping"] = Devise.mappings[:user] 
    sign_in @user 

根据this它说:

有两件事情需要牢记:

1)这些助手不会为由Capybara或Webrat驱动的集成测试工作。它们只能用于功能测试。相反,填写表格或明确地设置用户在会话中; 2)如果您正在测试Devise内部控制器或从Devise's继承的控制器,则需要告诉Devise在请求之前应使用哪个映射。这是必要的,因为Devise从路由器获取此信息,但由于功能测试不通过路由器,因此需要明确告知。例如,如果您正在测试用户范围,只需执行以下操作:

@request.env["devise.mapping"] = Devise.mappings[:user] 
get :new 
相关问题