在我的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方法之后,所以我的测试失败了。我在这里错过了什么?
答案 0 :(得分:1)
可能的解决方案:
expect(@basket.reload.user).to eq nil
为什么需要重新加载:
当您创建新购物篮并将其分配给@basket
时,它将分配一个关联的User
。然后,您拨打@user.disassociate_baskets
,通过逐个实例化来循环该用户的所有篮子,并更新他们的user
属性。
但是,由于@user.disassociate_baskets
实例化了全新的Basket
个实例,user
属性将仅在这些新实例中设置为nil
。 @basket
不知道另一个实例已被修改,并且必须手动重新加载。