1

我试图在 Rspec 3.0、Capybara 2.3 中存根 Spree 的 current_user 方法,但无济于事。我的目标是测试页面中只应在用户登录时出现的内容。如何在功能规范中存根 spree_current_user 助手?

功能规格

#spec/features/spree_variants_spec.rb
before(:each) do
  user = FactoryGirl.create(:user, first_name: "First name")
  helper.stub :spree_current_user => user # does not work
end

控制器

class Designers::SpreeVariantsController < ApplicationController
  def create
    ...
    @variant.attribute  = spree_current_user.first_name  #line 14
    ...
  end
end

错误

Failure/Error: click_button 'Create'
 NoMethodError:
   undefined method `first_name' for nil:NilClass
 # ./app/controllers/designers/spree_variants_controller.rb:14:in `create'

在存根该方法时,我也尝试过:

#2
Designers::SpreeVariantsController.stub :spree_current_user => instance_double(Spree.user_class, :has_spree_role? => true, :last_incomplete_spree_order => nil, :spree_api_key => 'fake', first_name: "First name")

#3
self.stub :spree_current_user => user # same error

#4
helper.stub :spree_current_user => user # does not recognize 'helper'
4

1 回答 1

2

RSpec 的请求和功能规范旨在测试整个堆栈,而不是单个控制器,因此您无法获得控制器的实例。在该控制器的所有实例上存根方法可能会满足您的需求:

allow_any_instance_of(Designers::SpreeVariantsController).to receive(:spree_current_user).and_return(user)

然而,

  • 根据 RSpec 文档,请求规范不支持 Capybara 的当前版本。如果它在请求规范中为您工作,那么到目前为止一切都很好,但您可能会走上一条已弃用的道路。编写能锻炼整个堆栈的规范的最新方法是特性规范

  • 请求规范和功能规范用于测试整个堆栈,而不是单元测试。在它们中存根有点可疑。您应该考虑编写一些用户通过 UI 登录的请求或功能规范,并在控制器规范中测试细节,您可以随意存根任何您喜欢的东西。

于 2014-08-08T17:01:01.857 回答