De retour des objets fantaisie de fille d'usine
-
09-09-2019 - |
Question
J'utilise Mocha et Factory_girl dans un JRuby rails application. Quand j'appelle l'usine, je voudrais revenir les objets avec un peu moqueur déjà fait. Voici un extrait de code de ce que je suis en train de le faire.
Factory.define :tweet_feed_with_tweets, :parent => :tweet_feed do |t|
t.expects(:pull_tweets).returns([Factory.build(:status),Factory.build(:status)])
end
Parce que je ne veux pas que mon unité et test fonctionnel pour réellement tirer de l'API twitter je veux bouchonner la méthode de sorte qu'il retourne ce que je veux. Mais ça ne fonctionne pas. L'objet revient sans stubbing fait. Est-il possible d'avoir effectivement stubbing effectué sur un objet créé avec une fille de l'usine avant qu'il ne soit retourné?
La solution
En regardant le code de documentation et source pour factory_girl
, il semble que l'objet a produit au bloc (t
, dans votre exemple) est une instance d'un Factory
et non une instance de l'objet que vous voulez construire (le tweet_feed_with_tweets
, dans votre exemple). Cela signifie que la mise en attente d'une méthode pour la pull_tweets
sur t
met l'attente sur l'instance Factory
et non sur l'objet qui sera construit lorsque vous appelez Factory(:tweet_feed_with_tweets)
. Je pense que cela explique pourquoi votre exemple ne fonctionne pas comme prévu.
Je peux me tromper, mais je ne vois pas une façon d'ajouter l'attente dans le bloc Factory.define
. Vous avez probablement déjà pensé à cela, mais je pense que vous feriez mieux d'ajouter l'attente dans le test après avoir construit l'instance: -
def test_should_do_something
tweet_feed = Factory(:tweet_feed)
tweet_feed.expects(:pull_tweets).returns([Factory.build(:status), Factory.build(:status)])
# test stuff here
end
Si vous avez besoin de ce à plusieurs endroits, vous pouvez l'extraire dans une méthode: -
def test_should_do_something
tweet_feed = build_tweet_feed_with_tweets
# test stuff here
end
private
def build_tweet_feed_with_tweets
tweet_feed = Factory(:tweet_feed)
tweet_feed.expects(:pull_tweets).returns([Factory.build(:status), Factory.build(:status)])
return tweet_feed
end
Quelques autres pensées: -
- Je pense que la définition des attentes dans un tel endroit caché est probablement une mauvaise idée de toute façon.
- Si vous allez le faire, je l'aurais pensé à l'aide
stubs
était plus approprié queexpects
. - Il pourrait être utile de séparer la méthode
pull_tweets
(et des méthodes similaires) dans une classe deTwitterAPI
. De cette façon, il ne semble pas si mauvais que vous avez besoin de mettre en place une attente sur leTwitterAPI
dans le test.
J'espère que certains de cette aide.
Autres conseils
Les callbacks sont maintenant disponibles:
Factory.define :tweet_feed_with_tweets, :parent => :tweet_feed do |t|
t.after_build do |tt|
tt.expects(:pull_tweets).returns([Factory.build(:status),Factory.build(:status)])
end
end