4

私はlib/user_session.rbにこのコードを持っています

これは、インクルードUserSessionを介して私のコントローラーの1つによって使用されます。

どうすればテストできますか?spec / lib / user_session.rbにテストを追加しましたが、コードはセッションに依存しているため、モックを作成する方法がわかりません。

module UserSession
  def viewed
    session[:viewed] ||= Array.new
    return session[:viewed]
  end

  def viewed_add(id, name)
    if viewed.select{|b| b[:id] == id}.empty?
      session[:viewed] << {:id => id, :name => name}
    end
    return session[:viewed]
  end

  def viewed_delete(id)
    unless id.nil?
      session[:viewed].delete_if{|b| b[:id] == id}
      return session[:viewed]
    end
  end
end
4

2 に答える 2

1

セッションで [] 演算子をモックまたはスタブする必要があります。たとえば、仕様では、次のことができます。

session.stub!(:[]).and_return "foo"

また

session.should_receive(:[]).with(:viewed)
于 2009-06-10T04:45:02.937 に答える
1

あなたのコードからわかる限り、ブラケット リーダーの形式で基本的なインターフェイスに準拠するオブジェクトに依存するほど、セッションに依存していません。

現在、私自身は RSpec を使用していないため、このシナリオでの使用方法を正確に説明することはできませんでしたが、ブラケット リーダー インスタンス メソッドまたはハッシュを使用してモック クラスを作成し、そのオブジェクトに対してテストします。例えば

fake_session = { :viewer => nil }
class << fake_session
  include UserSession
end
assert_equal [], fake_session.viewer

それが役立つことを願っています。

于 2009-04-29T12:51:53.817 に答える