如何在RSpec特性规范中存根Spree的spree_current_user方法?

时间:2014-08-04 13:29:34

标签: ruby-on-rails ruby-on-rails-4 rspec spree rspec3

我试图在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'

1 个答案:

答案 0 :(得分:2)

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

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

然而,

  • 根据RSpec文档request specs don't support current versions of Capybara。如果它在请求规范中为您工作,到目前为止一直很好,但您可能会在不推荐的路径上走下坡路。编写运行整个堆栈的规范的最新方法是feature specs

  • 请求规格和功能规格用于测试整个堆栈,而不是单元测试。它们中的顽固有点腥。您应该考虑编写一些用户通过UI登录的请求或功能规范,并在控制器规范中测试详细信息,您可以随意存根。