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

我在我的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:

从调试,我看到会议正在访问ActionDispatch :: TestProcess从@ request.session,和@请求是零。 当我从我的请求规范访问会话时@request是ActionController :: TestRequest的一个实例。

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

****更新****

这是因为在我的工厂中include ActionDispatch::TestProcess 。 删除这个包括排序问题。


我可以从助手规格访问会话对象吗?

是。

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:
    {}

会话对象在那里并返回一个空的散列。

尝试更详细地查看回溯以查找错误。 stack level too deep通常表示递归失败。


你正在测试has_basket_items? 在ApplicationHelper中执行一个动作,它在篮子表中检查basket_id的特定篮子,所以你应该在你的测试中使用Factory_Girl gem创建的一些篮子对象。

她的一个例子是:

basket1 = Factory(:basket, :name => 'basket_1')
basket2 = Factory(:basket, :name => 'basket_2')

你可以从这个屏幕上获得更多关于如何使用factory_girl的详细信息http://railscasts.com/episodes/158-factories-not-fixtures

它将在测试数据库中创建一个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正在创建的basket_id为be_true:

session[:basket_id] = basket1.id
helper.has_basket_items?.should be_true
链接地址: http://www.djcxy.com/p/66679.html

上一篇: Accessing session from a helper spec in rspec

下一篇: Safari 6 Gradient color blending/interpolation bug