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
不知道另一个实例被修改,必须手动重新加载。
在我的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
不知道另一个实例被修改,必须手动重新加载。