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)