2011-03-27 2 views
2

En utilisant Rails 3.0.5, RSpec 2 et Capybara 0.4.1.2 et essayer d'écrire une spécification de contrôleur pour ma nouvelle action SessionsController #.Objets Rspec et Capybara correspondants

it "assigns the empty session to a variable" do 
    get :new 
    assigns(:session).should == ActiveRecord::Base::Session.new 
end 

J'utilise l'espace de noms ActiveRecord :: Base comme il semble entrer en conflit avec la classe Session Capybara quand je ne le fais pas.

Voici le SessionsController:

class SessionsController < ApplicationController 
    def new 
    @session = Session.new 
    end 
end 

RSpec ne semble pas comprendre ce sont les mêmes objets. Voici ce que mon test retourne:

Failure/Error: assigns(:session).should == ActiveRecord::Base::Session.new 
    expected: #<Session id: nil, session_id: nil, data: nil, created_at: nil, updated_at: nil> 
     got: #<Session id: nil, session_id: nil, data: nil, created_at: nil, updated_at: nil> (using ==) 
    Diff: 
# ./spec/controllers/sessions_controller_spec.rb:17:in `block (3 levels) in <top (required)>' 

Des indices?

Répondre

3

Le problème est que si vous faites

ActiveRecord::Base::Session.new == ActiveRecord::Base::Session.new 

Vous obtiendrez faux, comme ces deux objets ont une object_id séparée.

Essayez ceci:

assigns(:session).should be_an(ActiveRecord::Base::Session) 
+0

Merci, cela fonctionne. Par curiosité ... cela ferait-il une différence si j'utilisais 'be_an' ou' be_an_instance_of' ici? – Cimm

+0

Ah oui. 'be_an' vérifie les chèques' kind_of? 'et' be_an_instance_of' pour 'instance_of?'. Donc, be_an sera également vrai pour chaque instance de n'importe quelle classe qui hérite de AR :: Base :: Session. Plus d'infos: http://stackoverflow.com/questions/3893278/ruby-kind-of-vs-instance-of-vs-is-a – Dogbert

+0

Cool, merci pour la réponse! – Cimm

Questions connexes