我试图在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'
答案 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登录的请求或功能规范,并在控制器规范中测试详细信息,您可以随意存根。