使用rspec在rails上测试ruby中的会话装饰器库

时间:2009-04-27 15:52:59

标签: ruby-on-rails rspec

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

我的一个控制器使用它包括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

2 个答案:

答案 0 :(得分:1)

就我从你的代码中看到的那样,你不依赖于会话,因为你依赖于一个符合括号阅读器形式的基本界面的对象。

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

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

希望有所帮助。

答案 1 :(得分:1)

您需要在会话中模拟或存根[]运算符。例如,在您的规范中,您可以执行以下操作:

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

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