从rspec中的帮助程序规范访问会话

Dav*_* Oh 7 ruby tdd rspec ruby-on-rails

我的ApplicationHelper中有一个方法可以检查我的购物篮中是否有任何商品

module ApplicationHelper
  def has_basket_items?
    basket = Basket.find(session[:basket_id])
    basket ? !basket.basket_items.empty? : false
  end
end
Run Code Online (Sandbox Code Playgroud)

这是我的帮助规范,我必须测试这个:

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
Run Code Online (Sandbox Code Playgroud)

但是,当我运行测试时,我得到了

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:
Run Code Online (Sandbox Code Playgroud)

从调试开始,我看到在@ request.session的ActionDispatch :: TestProcess中正在访问该会话,并且@request是nil.当我从我的请求访问会话时,规范@request是ActionController :: TestRequest的一个实例.

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

****更新****

这归结include ActionDispatch::TestProcess于我的工厂.删除此选项包括对问题进行排序.

zet*_*tic 3

我可以从帮助程序规范访问会话对象吗?

是的。

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:
    {}
Run Code Online (Sandbox Code Playgroud)

会话对象在那里并返回一个空哈希。

尝试更详细地查看回溯以查找错误。 stack level too deep通常表明递归出了问题。

  • 进一步检查表明,这归因于我的工厂中包含“include ActionDispatch::TestProcess”,因为我使用“fixture_file_upload”在模型中包含测试图像。由于我实际上并不使用它们,所以我已将它们删除。唷! (3认同)