2009-04-27 34 views
4

我在lib/user_session.rb中有這樣的代碼在rspec上測試ruby中的會話裝飾器lib

其中一個控制器通過包含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 

回答

1

您需要在會話上模擬或存根[]運算符。例如,在你的天賦,你可以這樣做:

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

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

據我可以從你的代碼中看到的,你不依賴於會議這麼多,因爲你靠的是符合在支架閱讀器形式的基本接口的對象上。

現在,我不使用RSpec自己,所以我不能說在這種情況下如何使用它,但我會創建一個帶支架閱讀器實例方法的模擬類,甚至是哈希,然後測試反對這個對象,例如

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

希望有幫助。

相關問題