Ruby on rails 使用rspec在rubyonrails中测试会话装饰库

Ruby on rails 使用rspec在rubyonrails中测试会话装饰库,ruby-on-rails,rspec,Ruby On Rails,Rspec,我在lib/user_session.rb中有这段代码 它由我的一个控制器通过include UserSession使用 我如何测试它?我在spec/lib/user_session.rb中添加了测试,但是代码依赖于会话,我不确定如何模拟会话 module UserSession def viewed session[:viewed] ||= Array.new return session[:viewed] end def viewed_add(id, name)

我在lib/user_session.rb中有这段代码

它由我的一个控制器通过include UserSession使用

我如何测试它?我在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
模块用户会话
查看def
会话[:已查看]| |=Array.new
返回会话[:已查看]
结束
已查看def_添加(id、名称)
如果查看。请选择{| b | b[:id]==id}。是否为空?
会话[:已查看]id,:name=>name}
结束
返回会话[:已查看]
结束
已查看def_删除(id)
除非id.nil?
会话[:已查看]。如果{| b | b[:id]==id}则删除
返回会话[:已查看]
结束
结束
结束

据我从您的代码中所见,您并不依赖于会话,而是依赖于符合括号读取器形式的基本接口的对象

现在,我自己不使用RSpec,所以我不能确切地说在这个场景中如何使用它,但我会创建一个带有括号读取器实例方法的模拟类,甚至是一个哈希,然后对该对象进行测试,例如

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

类您需要在会话上模拟或存根[]操作符。例如,在等级库中,可以执行以下操作:

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

session.should_receive(:[]).with(:viewed)