有人可以解释一下这个RSpec存根是如何工作的吗?

时间:2014-09-26 19:13:19

标签: ruby-on-rails ruby rspec devise

我正在使用Rails4并设计。在编写控制器规范时,我遇到了这段代码:

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

...... here

有效。我编写的控制器规范要求认证适当传递。

我已经阅读了一些关于存根如何工作的网页条目,我想我明白了。似乎快速且足以满足我的需求。

即使上面的代码使用RSpec double方法,我仍然会收到此折旧警告:

  

在没有明确说明的情况下,使用rspec-mocks的旧stub语法中的:should   不推荐使用语法。使用新的:expect语法或   明确启用:should。来自   /Users/perry_mac/rails_projects/mymri/spec/controllers/steps_controller_spec.rb:14:in   `阻止(2级)'。

因为我使用的是“new:expect语法”,所以让我感到困惑。所以我对这个原本有用的代码片段感到不安。例如,我不能立即清楚如何使用它编写一个测试,该测试使用两个用户登录并确保每个用户只看到他们适当范围的搜索结果。是否有更合适的方法来存根会话以检查使用身份验证的控制器?

并且......为什么上述工作,但这样的事情不是?:

before(:each) {  
email = "user@example.com"  
password= "password"  
@user = FactoryGirl.create(:user, email: email, password: password)  

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

1 个答案:

答案 0 :(得分:1)

显然,我所需要的只是:

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

根据this说:

有两件事要记住:

1)这些助手不适用于由Capybara或Webrat驱动的集成测试。它们仅用于功能测试。相反,填写表单或在会话中明确设置用户;

2)如果您正在测试Devise内部控制器或继承自Devise的控制器,您需要告诉Devise在请求之前应该使用哪个映射。这是必要的,因为Devise从路由器获取此信息,但由于功能测试不通过路由器,因此需要明确告知。例如,如果您正在测试用户范围,只需执行以下操作:

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