Relation active entre ActiveRecord dans les tests RSpec
J'ai rencontré ce problème avec les tests. Imaginons que j'ai deux modèles, l'Utilisateur et le Poste de l'utilisateur has_many :les postes.
Je suis en train de spec un bloc de code qui comprend quelque chose comme ceci:
user = User.find(123)
post = user.posts.find(456)
Je sais comment se moquer de la User.find
et user.posts
pièces. Le user.posts
maquette retourne un tableau de Post-objets. Et quand elle est à .find(456)
partie, tout se casse avec no block given
exception.
Donc ma question est: que dois-je retourner le résultat de la user.posts
fantaisie, de sorte que .find(456)
méthode fonctionne? User.first.posts.class
dit que c'est du Tableau, mais à l'évidence il y a quelque chose de plus qui fait que l'AR-style trouver des appels. Je ne suis pas ravi par la perspective de se moquer de find méthode sur l'objet retourné.
PS Avant de suggérer l'évidence et la bonne réponse d'arrêter les moqueries au sujet et à l'aide de luminaires/ensemencement de la base de données de test avec des données nécessaires, le hic, c'est: l'héritage régime. L'Utilisateur et le Poste de travail sur le dessus de vues de base de données pas de tables, et de sa transformation, de sorte qu'ils sont des tables dans la base de données de test semble mauvais pour moi.
source d'informationauteur Toms Mikoss
Vous devez vous connecter pour publier un commentaire.
Le problème est que
user.posts
n'est pas fait un simpleArray
; c'est une association objet proxy. La façon de stub c'est probablement quelque chose comme cela (même si la syntaxe exacte dépend de la moquerie framework que vous utilisez):Puis dans votre test,
User.find(123)
sera de retour@user
et@user.posts.find(456)
sera de retour@post
. Si vous avez besoin d'@user.posts
à agir comme plus de laArray
dans vos tests, vous pouvez créer unmock(Array)
et talon la[](index)
méthode.Vous pouvez regarder dans le stub_chain méthode offerts par RSpec.
http://apidock.com/rspec/Spec/Mocks/Methods/stub_chain#855-stub-chain-is-very-useful-when-testing-controller-code
Mise à jour: Par ryan2johnson9 la mise à jour de la documentation est : https://relishapp.com/rspec/rspec-mocks/v/3-2/docs/working-with-legacy-code/message-chains