2010-07-22 6 views
0

je suis passé à Rails 3 et RSpec 2 et l'un de mes tests RSpec a cessé de fonctionner:test d'association rspec ne fonctionne que dans un sens

# Job.rb 
class Job < ActiveRecord::Base 
    has_one :location 
    belongs_to :company 

    validates_associated :location 
end 

# Location.rb 
class Location < ActiveRecord::Base 
    belongs_to :job 
end 

# job_spec.rb 
describe Job, "location" do 
    it "should have a location" do 
    job = Factory(:job) 
    location = Factory(:location, :job_id => job.id) 

    location.job.should == job  #true 
    job.location.should == location #false 
    end           
end 

job.location évalue à zéro mais location.job est correcte. Il fonctionne également très bien si je me débarrasse de validates_associated :location. Quelqu'un peut-il expliquer pourquoi cela ne fonctionne pas?

+0

Votre usine '' create' ou build' par défaut? Je voudrais définir une autre usine ': job_with_a_location' où vous utilisez les constructeurs d'association pour vous assurer qu'il est correctement rempli. Mais ça n'explique pas pourquoi ça ne marche plus :) – nathanvda

Répondre

2

Le travail est déjà en mémoire. ou vous le rechargez après avoir créé l'emplacement, ou utilisez lambda/expect. par exemple:

describe Job, "location" do 
    it "should have a location" do 
    job = Factory(:job) 
    location = Factory(:location, :job_id => job.id) 
    job.reload 
    location.job.should == job  #true 
    job.location.should == location #false 
    end 

    it "should have a location" do 
    job = Factory(:job) 

    expect { 
     location = Factory(:location, :job_id => job.id) 
    }.to change(job, :location).to(location) 
    lambda { 
     location = Factory(:location, :job_id => job.id) 
    }.should change(job, :location).to(location) 

    location.job.should == job  #true   
    end           
end 

plus d'info ici: http://rspec.rubyforge.org/rspec/1.3.0/classes/Spec/Matchers.html#M000168

Questions connexes