J'ai un objet qui enregistre un modèle et exécute un travail d'arrière-plan.Vérifier qu'une séquence de messages est envoyée à différents objets/classes
Class UseCase
...
def self.perform
@account.save
BackgroundJob.perform_later(@account.id)
end
end
Dans mon spec je voudrais tester séparément que les deux messages sont envoyés.
J'ai commencé avec quelque chose comme
it 'saves the account' do
expect_any_instance_of(Account).to receive(:save)
UseCase.perform(account)
end
Et cela a bien fonctionné quand je gardais juste le compte dans le perform
. Mais quand j'ai ajouté le travail d'arrière-plan la spécification ne passe plus depuis maintenant Couldn't find Account without an ID
.
Comment puis-je vérifier (en RSped 3.5) séparément que les deux messages sont envoyés?
MISE À JOUR
it 'runs the job' do
expect(BackgroundJob).to receive(:perform_later).with(instance_of(Fixnum))
UseCase.perform(account)
end
passe je suppose que le compte est correctement enregistré.
Cependant, lorsque je tente d'inspecter @account
def self.perform
@account.save
byebug
BackgroundJob.perform_later(@account.id)
end
Dans 'sauve le compte', je reçois
(byebug) @account
#<Account id: nil, full_name: "john doe" ...>
In 'exécute le travail', je reçois
(byebug) @account
#<Account id: 1, full_name: "john doe" ...>
L'attente fait @account
un test double donc dans la première spécification le travail ne peut pas obtenir l'ID.
Merci
Avez-vous une spécification qui vérifie que '@ account.save' renvoie réellement' true'? Je suppose que '@account.save' renvoie 'false', le compte est invalide, n'a pas été sauvegardé et n'a donc pas d'identifiant. – spickermann
Je crois que @spickermann est correct. J'ai ajouté une réponse pour expliquer la différence entre 'save!' Et 'save'. Espérons que cela vous aide –