RSpec无法识别已删除的关联

时间:2017-07-13 15:22:19

标签: ruby-on-rails rspec factory-bot faker

在我的rails应用程序中,用户有很多篮子,篮子属于用户。 User类还包含一个实例方法,用于从所有关联的bask中删除用户的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块内的对象,它们没问题,但@basket仍然与@user关联,即使在运行disassociate_baskets方法之后,所以我的测试失败了。我在这里错过了什么?

1 个答案:

答案 0 :(得分:1)

可能的解决方案:

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

为什么需要重新加载:

当您创建新购物篮并将其分配给@basket时,它将分配一个关联的User。然后,您拨打@user.disassociate_baskets,通过逐个实例化来循环该用户的所有篮子,并更新他们的user属性。

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