J'ai un rappel after_destroy que je m'attendrais à renvoyer nil mais qui a toujours une valeur.

class WeighIn < ActiveRecord::Base
  belongs_to :check_in
  after_destroy :add_employee_weightloss

  def add_employee_weightloss
    p self.check_in.weigh_in.present? # returns true
  end
end

Spécifications :

it "employee weightloss" do
  ci = CheckIn.create()
  wi = WeighIn.create(check_in_id: ci.id)

  wi.destroy
  expect(wi.reload).to eq(nil) # returns wi instead of nil
end
0
Jeremy Thomas 11 sept. 2018 à 15:42

1 réponse

Meilleure réponse

Vous devez utiliser destroyed? (ou exists?, ou persisted?) à la place, car present? vérifie simplement si l'objet est présent, ce qui est le comportement correct après la destruction (destroy lui-même renvoie l'objet supprimé).

def add_employee_weightloss
  p check_in.weigh_in.destroyed?
end

Vous ne devez pas non plus utiliser les éléments suivants :

expect(wi.reload).to eq(nil)

Car si wi a été détruit, vous obtiendrez une exception ActiveRecord::RecordNotFound au lieu de nil. Vous pouvez essayer ce qui suit :

it "employee weightloss" do
  wi = WeighIn.create(check_in: CheckIn.create)
  wi.destroy

  expect(wi.destroyed?).to eq(true)
end
1
potashin 11 sept. 2018 à 15:53