Новичок RSpec здесь.
Я пытаюсь протестировать свои модели, в которых есть методы, использующие update_attributes
для обновления значений других моделей.
Я уверен, что значения сохраняются в базе данных, ноони не передают спецификации.
Однако, когда я включаю что-то вроде @user.reload
, это работает.
Мне интересно, делаю ли я что-то неправильно.В частности, как следует тестировать модели, которые изменяют атрибуты других моделей?
ОБНОВЛЕНО кодом:
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
end
На практике. Rb
def marking_completed
# Update user points
user.add_points(100)
self.completed = true
self.save!
end
In User.rb
def add_points(points)
self.points += points
update_attributes(:points => self.points)
end