【问题标题】:Can someone please explain how this RSpec stub is working?有人可以解释一下这个 RSpec 存根是如何工作的吗?
【发布时间】:2014-09-26 19:13:19
【问题描述】:

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

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

...here

它有效。我编写的控制器规范要求适当地通过身份验证。

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

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

使用来自 rspec-mocks 的旧 :should 语法的 stub 没有显式 启用语法已弃用。使用新的:expect 语法或 改为显式启用:should。调用自 /Users/perry_mac/rails_projects/mymri/spec/controllers/steps_controller_spec.rb:14:in '块(2级)'。

这让我很困惑,因为我使用的是“新的 :expect 语法”。所以我对这个原本可以工作的代码 sn-p 感到模糊的不安。例如,目前尚不清楚如何使用它来编写一个测试,该测试利用两个用户登录并确保每个用户只能看到其适当范围的搜索结果。是否有更合适的方法来存根会话以检查使用身份验证的控制器?

而且...为什么上面的工作有效,但这样的事情却没有?:

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

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

【问题讨论】:

    标签: ruby-on-rails ruby rspec devise


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2023-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多