2017-03-05 1 views
3

ich vor kurzem zu ändern begann mit rspec zu testen, so kann ich stark irren, mich zu korrigieren, wenn es eine bessere Art und Weise istder richtige Weg, um das zugehörige Objekt in rspec

Ich schaffe zwei verwandte Modelle

let(:user) {FactoryGirl.create :user} 
let!(:participation) {FactoryGirl.create :participation, user: user} 

und vor einem der Tests ändern eines der zugehörigen Objekte

context "when" do 
    before {participation.prize = 100} 
    it "" do 
    binding.pry 
    end 
end 

Aber im Inneren

participation.prize => 100 
user.participatons.select(:prize) => nil 

was mache ich falsch? und wie man es repariert?

Antwort

1

Wenn Sie user.participations.select(:prize) sagen, machen Sie eine Abfrage an die db, um Werte in den Preisspalten der Benutzerbeteiligung zu erhalten. Aber wenn Sie before {participation.prize = 100} sagen, setzen Sie nur den Preis Attribut auf dem Teilnahmeobjekt. Versuchen Sie, die Teilnahme vor der Auswahlleitung zu speichern:

participation.prize # => 100 
participation.save 
user.participatons.select(:prize) # => nil 

Ein weiteres mögliches Problem ist, dass user.participations wurde von einem früheren Aufruf memoized worden. Stellen Sie sicher, dass user.participations.first == participation. Ist dies nicht der Fall ist, überprüfen

1) puts participation.user_id und

2) puts user.participations, user.reload.participations


schließlich einen besseren Weg, den Test einrichten, so dass Sie in dieser Frage laufen weniger häufig ist etwas, entlang der Linien von:

# let(:price) { 0 } # default price. Optional so that tests won't throw errors if you forget to set it in a context/describe block. 
let(:user) {FactoryGirl.create :user} 
let!(:participation) {FactoryGirl.create :participation, user: user, price: price} 

# ... 

context "when ..." do 
    let(:price) { 100 } 
    it "" do 
    binding.pry 
    end 
end 

auf diese Weise wird der Preis gesetzt, wenn Sie das Modell erstellen. Diesem Muster zu folgen bedeutet in der Regel, weniger auf dieses Problem einzugehen.

Verwandte Themen