RSpec 无法识别已删除的关联

RSpec not recognizing deleted association

在我的rails应用中,一个用户有多个篮子,一个篮子属于一个用户。 User class 还包含一个实例方法,用于从所有关联的购物篮中删除用户的 ID。我在使用 RSpec、FactoryGirl 和 Faker 测试该方法时遇到问题。

class Basket
  belongs_to :user, optional: true
end

class User
  has_many: baskets

  def disassociate_baskets
    baskets.each { |b| b.update(user: nil) }
  end
end

disassociate_baskets 方法适用于真实数据,我的 RSpec 测试失败了,因为在测试环境中,因为即使在 运行 该方法之后,篮子用户关联仍然存在。这是我的测试代码:

#Basket Factory
FactoryGirl.define do
  factory :basket do
    date { Faker::Date.backward }
  end
end

#User Factory
FactoryGirl.define do
  factory :user do
    name { Faker::Name.name }
  end
end

#user_spec.rb
describe "When deleting purchase history" do
  before do
    @user = create(:user)
    @user1 = create(:user)
    @basket = create(:basket, user: @user)
    @basket1 = create(:basket, user: @user)
    @basket2 = create(:basket, user: @user1)
  end

  it "disassociates the user from the basket" do
    @user.disassociate_baskets
    expect(@basket.user).to eq nil
  end
end

我已经检查了 it 块中的对象,它们很好,但是即使在 运行 disassociate_baskets 方法之后,@basket 仍然与 @user 相关联,所以我的测试失败。我在这里错过了什么?

可能的解决方案:

expect(@basket.reload.user).to eq nil

为什么要重载:

当您创建新篮子并将其分配给 @basket 时,它将有一个关联的 User 分配给它。然后,您调用 @user.disassociate_baskets,它通过 一个一个地实例化它们 并更新它们的 user 属性来遍历该用户的所有篮子。

但是由于 @user.disassociate_baskets 实例化了全新的 Basket 实例,user 属性将仅在这些新实例中设置为 nil@basket 不知道另一个实例被修改,必须手动重新加载。