2009-04-27 5 views
4

Je le code dans lib/user_session.rbTest d'un décorateur de sessions lib en Ruby on Rails avec rspec

Son utilisé par l'un de mes contrôleurs via inclure UserSession.

Comment puis-je le tester? J'ai ajouté des tests dans spec/lib/user_session.rb mais le code repose sur la session dont je ne sais pas trop comment me moquer.

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 

Répondre

1

Vous devez simuler ou remplacer l'opérateur [] sur la session. Par exemple, dans vos spécifications, vous pouvez faire:

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

ou

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

Pour autant que je peux voir à partir de votre code, vous ne comptez pas sur la session tant que vous comptez sur un objet qui est conforme à une interface de base sous la forme d'un lecteur de support. Maintenant, je n'utilise pas RSpec moi-même, donc je ne pourrais pas dire exactement comment l'utiliser dans ce scénario, mais je créerais une classe mock avec une méthode d'instance de bracket bracket, ou même un hachage, puis test contre cet objet, par exemple

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

Espérons que ça aide.