Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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中的助手规范访问会话_Ruby On Rails_Ruby_Rspec_Tdd - Fatal编程技术网

Ruby on rails 从rspec中的助手规范访问会话

Ruby on rails 从rspec中的助手规范访问会话,ruby-on-rails,ruby,rspec,tdd,Ruby On Rails,Ruby,Rspec,Tdd,我的ApplicationHelper中有一个方法,用于检查篮子中是否有任何项目 module ApplicationHelper def has_basket_items? basket = Basket.find(session[:basket_id]) basket ? !basket.basket_items.empty? : false end end 以下是我必须测试的助手规范: require 'spec_helper' describe Applica

我的ApplicationHelper中有一个方法,用于检查篮子中是否有任何项目

module ApplicationHelper
  def has_basket_items?
    basket = Basket.find(session[:basket_id])
    basket ? !basket.basket_items.empty? : false
  end
end
以下是我必须测试的助手规范:

require 'spec_helper'

describe ApplicationHelper do
  describe 'has_basket_items?' do
    describe 'with no basket' do

      it "should return false" do
        helper.has_basket_items?.should be_false
      end

    end
  end
end
然而,当我运行测试时,我得到

SystemStackError: stack level too deep
/home/user/.rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.2.8/lib/action_dispatch/testing/test_process.rb:13:
通过调试,我看到正在从@request.session访问ActionDispatch::TestProcess中的会话,@request为nil。当我从请求中访问会话时,specs@request是ActionController::TestRequest的一个实例

我的问题是我可以从助手规范访问会话对象吗?如果可以,怎么做?如果我不能,测试这种方法的最佳实践是什么

***更新***


这是因为在我的工厂里有
include ActionDispatch::TestProcess
。删除此包含项会对问题进行排序。

您正在测试的是否有\u篮子\u项?ApplicationHelper中的操作,它在baskets表中检查具有basket\u id的特定basket,因此测试中应该有一些basket对象,可以使用gem创建这些对象

她的例子是:-

basket1 = Factory(:basket, :name => 'basket_1')
basket2 = Factory(:basket, :name => 'basket_2')
你可以从这个屏幕上获得更多关于如何使用factory_girl的详细信息

它将在测试数据库中创建一个Factory对象。因此,基本上您可以创建一些factory对象,然后在会话中设置一个basket_id来检查它的存在,如下所示:

session[:basket_id] = basket1.id
所以,你的测试应该是这样的:-

require 'spec_helper'

describe ApplicationHelper do
  describe 'has_basket_items?' do
    describe 'with no basket' do

      it "should return false" do
        basket1 = Factory(:basket, :name => 'basket_1')
        basket2 = Factory(:basket, :name => 'basket_2')
        session[:basket_id] = 1234 # a random basket_id 
        helper.has_basket_items?.should be_false
      end

    end
  end
end
或者,您可以使用以下方法检查factory_girl创建的篮子_id是否为真:

session[:basket_id] = basket1.id
helper.has_basket_items?.should be_true
我可以从助手规范访问会话对象吗

会话对象存在并返回一个空哈希


尝试更详细地查看回溯以查找错误<代码>堆栈级别太深通常表示递归出错。

我尝试了你的建议,但不幸的是我得到了相同的结果。据我所知,这似乎更多地是因为请求对象没有被注入到我的助手中,而不是对象在数据库中不存在。事实上,我的方法不需要存在任何篮子实体才能工作。不幸的是,这也给同一堆栈带来了太深的错误。调试递归将转到ActionDispatch::TestProcess中的session方法,该方法调用
@request。session
和@request为nil
@request.session
似乎在ActionDispatch::TestProcess上调用session,因此会循环,直到堆栈太深。因此,我认为我需要以某种方式将会话注入助手,但我似乎无法解决如何注入的问题。我在回答中运行了代码,并将空哈希作为输出。这表明你的环境可能有问题。我会尝试将一个干净的Rails安装到一个新项目中,看看问题是否仍然存在。好吧,经过一点实验后,我发现是
factory\u girl\u Rails
gem引起了我的头疼,这是非常烦人的,因为我有数百个测试使用它。我要看看是否有任何修复,否则看起来我将不得不找到一个工厂女孩的替代品。感谢您为我指明了正确的方向。进一步的检查表明,这是由于我在工厂中使用
include ActionDispatch::TestProcess
,因为我使用
fixture\u file\u upload
将测试图像包括在模型中。因为我实际上没有使用这些,所以我已经把它们去掉了。呸!要使用FactoryGirl而不使用“ActionDispatch::TestProcess”附加文件,请使用:
image{Rack::Test::UploadedFile.new('spec/factories/Test.png','image/png')}
,请参阅:和
module ApplicationHelper
  def has_basket_items?
    raise session.inspect
    basket = Basket.find(session[:basket_id])
    basket ? !basket.basket_items.empty? : false
  end
end

$ rspec spec/helpers/application_helper.rb

Failure/Error: helper.has_basket_items?.should be_false
  RuntimeError:
    {}