4

我在 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
4

2 回答 2

1

据我从您的代码中可以看出,您不依赖会话,而是依赖符合括号阅读器形式的基本接口的对象。

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

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

希望有帮助。

于 2009-04-29T12:51:53.817 回答
1

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

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

或者

session.should_receive(:[]).with(:viewed)
于 2009-06-10T04:45:02.937 回答