Question

RSPEC débutant ici.

J'essaie de tester mes modèles, qui ont des méthodes qui utilisent update_attributes pour mettre à jour les valeurs d'autres modèles.

Je suis sûr que les valeurs sont persistées dans la base de données, mais elles ne font pas passer les spécifications.

Cependant, quand j'inclus quelque chose comme @user.reload Ça marche.

Je me demande si je fais mal les choses. Plus précisément, comment tester les modèles qui changent les attributs d'autres modèles?

Mise à jour avec le code:

describe Practice do

before(:each) do
    @user = build(:user)
    @user.stub!(:after_create)
    @user.save!

    company = create(:acme)
    course = build(:acme_company, :company => company)
    course.save!

  @practice = create(:practice, :user_id => @user.id, :topic => "Factors and Multiples" )
end

describe "#marking_completed" do

    it "should calculate the points once the hard practice is done" do
        @practice.question_id = Question.find(:first, conditions: { diff: "2" }).id.to_s
        @practice.responses << Response.create!(:question_id => @practice.question_id, :marked_results => [true,true,true,true])
        @practice.save!

        lambda {
            @practice.marking_completed
            @practice.reload # <-- Must add this, otherwise the code doesn't work
        }.should change { @practice.user.points }.by(20)
    end
end

fin

Dans la pratique.rb

def marking_completed       

# Update user points
user.add_points(100)
self.completed = true
self.save!

fin

Dans user.rb

def add_points(points)
self.points += points
update_attributes(:points => self.points)

fin

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top