RSpec 记录属性未更新
RSpec records attribute doesn't update
尝试测试对答案进行投票是否会更新其分数。
分数会更新,但它与测试的对象不同。
(每个投票都有自己的可投票答案对象,具有相同的 .id)
因此规范失败。
在 rspec 测试期间撬动控制台:
> Answer.first
=> #<Answer:0x000000087b6418 id: 1, (...) score: 2>
> answer
=> #<Answer:0x000000081bea88 id: 1, (...) score: 0>
vote_spec.rb
answer ||= FactoryGirl.create(:answer)
vote = FactoryGirl.create(:vote, like: true, user_id: 1, voteable_id: answer.id, voteable_type: "Answer")
vote2 = FactoryGirl.create(:vote, like: true, user_id: 2, voteable_id: answer.id, voteable_type: "Answer")
vote3 = FactoryGirl.create(:vote, like: true, user_id: 3, voteable_id: answer.id, voteable_type: "Answer")
vote4 = FactoryGirl.create(:vote, user_id: 4, voteable_id: answer.id, voteable_type: "Answer")
expect(answer.score).to eq(2)
vote.rb
after_create :set_voteable_score
private
def set_voteable_score
self.voteable.update_column(:score, count_score(self.voteable))
true
binding.pry
end
def count_score(voteable)
votes = voteable.votes.all
votes.where(like: true).count - votes.where(like: false).count
end
因此,如果我用所有投票(投票、投票 2、投票 3...)检查 vote.voteable.score,每个 returns 一个不同的可投票对象,并且 vote_spec.rb 中的答案不'得到更新。
为什么会出现这种行为(存在超过 1 个具有相同 ID 的记录)?
如果所有的voteables都有相同的id,那么他们都是相同的记录。那么你所拥有的可能是记录的不同实例,它们是在不同时间从数据库加载的。
试试这个:
expect(answer.reload.score).to eq(2)
尝试测试对答案进行投票是否会更新其分数。 分数会更新,但它与测试的对象不同。 (每个投票都有自己的可投票答案对象,具有相同的 .id) 因此规范失败。
在 rspec 测试期间撬动控制台:
> Answer.first
=> #<Answer:0x000000087b6418 id: 1, (...) score: 2>
> answer
=> #<Answer:0x000000081bea88 id: 1, (...) score: 0>
vote_spec.rb
answer ||= FactoryGirl.create(:answer)
vote = FactoryGirl.create(:vote, like: true, user_id: 1, voteable_id: answer.id, voteable_type: "Answer")
vote2 = FactoryGirl.create(:vote, like: true, user_id: 2, voteable_id: answer.id, voteable_type: "Answer")
vote3 = FactoryGirl.create(:vote, like: true, user_id: 3, voteable_id: answer.id, voteable_type: "Answer")
vote4 = FactoryGirl.create(:vote, user_id: 4, voteable_id: answer.id, voteable_type: "Answer")
expect(answer.score).to eq(2)
vote.rb
after_create :set_voteable_score
private
def set_voteable_score
self.voteable.update_column(:score, count_score(self.voteable))
true
binding.pry
end
def count_score(voteable)
votes = voteable.votes.all
votes.where(like: true).count - votes.where(like: false).count
end
因此,如果我用所有投票(投票、投票 2、投票 3...)检查 vote.voteable.score,每个 returns 一个不同的可投票对象,并且 vote_spec.rb 中的答案不'得到更新。
为什么会出现这种行为(存在超过 1 个具有相同 ID 的记录)?
如果所有的voteables都有相同的id,那么他们都是相同的记录。那么你所拥有的可能是记录的不同实例,它们是在不同时间从数据库加载的。
试试这个:
expect(answer.reload.score).to eq(2)