7

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であることがわかります。リクエスト仕様からセッションにアクセスすると、@requestはActionController::TestRequestのインスタンスになります。

私の質問は、ヘルパー仕様からセッションオブジェクトにアクセスできますか?できればどうやって?また、この方法をテストするためのベストプラクティスがわからない場合はどうすればよいですか?

****更新**** _

これはinclude ActionDispatch::TestProcess私の工場にあることに帰着しました。このインクルードを削除すると、問題が分類されます。

4

2 に答える 2

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

セッション オブジェクトが存在し、空のハッシュを返します。

バックトレースをさらに詳しく調べて、エラーを見つけてください。 stack level too deep通常、再帰が失敗したことを示します。

于 2012-12-04T06:44:45.297 に答える
2

has_basket_items をテストしていますか? バスケットテーブルのbasket_idで特定のバスケットをチェックするApplicationHelperのアクションなので、 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
于 2012-12-03T10:04:56.133 に答える