【问题标题】:Testing a sessions decorator lib in ruby on rails with rspec使用 rspec 在 ruby​​ on rails 中测试会话装饰器库
【发布时间】:2026-01-29 03:10:01
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails rspec


    【解决方案1】:

    您需要在会话中模拟或存根 [] 运算符。例如,在您的规范中,您可以这样做:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      希望对您有所帮助。

      【讨论】: