Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何存根狂欢';RSpec功能规范中的spree_current_用户方法?_Ruby On Rails_Ruby On Rails 4_Rspec_Spree_Rspec3 - Fatal编程技术网

Ruby on rails 如何存根狂欢';RSpec功能规范中的spree_current_用户方法?

Ruby on rails 如何存根狂欢';RSpec功能规范中的spree_current_用户方法?,ruby-on-rails,ruby-on-rails-4,rspec,spree,rspec3,Ruby On Rails,Ruby On Rails 4,Rspec,Spree,Rspec3,我试图在RSpec3.0和Capybara2.3中存根Spree当前的用户方法,但没有用。我的目标是测试页面的内容,这些内容应该只在用户登录时出现。如何在功能规范中存根spree_current_user helper 功能规格 #spec/features/spree_variants_spec.rb before(:each) do user = FactoryGirl.create(:user, first_name: "First name") helper.stub :spre

我试图在RSpec3.0和Capybara2.3中存根Spree当前的用户方法,但没有用。我的目标是测试页面的内容,这些内容应该只在用户登录时出现。如何在功能规范中存根spree_current_user helper

功能规格

#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'

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

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

  • 根据RSpec文件。如果它在请求规范中对您有效,那么到目前为止还不错,但您可能正在走一条不推荐的道路。最新的编写规范的方法是使用整个堆栈

  • 请求规范和功能规范用于测试整个堆栈,而不是单元测试。在他们身上打短棍有点可疑。您应该考虑编写一些请求或特性规范,用户通过该UI登录,并在控制器规范中测试细节,在那里您可以自由地存根您喜欢的任何东西。


您使用的是什么版本的rspec?您是否在使用rspec rails?rspec版本3.0.0和gem rspec rails 3.0.1Ah。嗯,我还没走到我无法切换到功能规格的地步,谢谢。我想做的是测试页面上的某些内容,基于用户是否已登录(理想情况下,具有特定角色)。我只是在绝望中试图切断控制器。在spree中登录到功能规范的正确方式是什么?你知道吗,我现在很困惑。你在这里很好地回答了我的问题,谢谢。我要重新整理我的想法,因为我这里有两个不同的问题。谢谢,我想你是对的。尽管如此:您不会显示为已登录,而是实际登录。不知道确切的值,但有点模糊,比如
访问某个路径;在“用户名”中填写:“用户名”;在“密码”中填写:“密码”
;点击“登录”按钮。这改变了我第二期的整个方法。谢谢,我会顺着那条路往下看。