En regardant la documentation & code source pour factory_girl
, il semble que l'objet a donné 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 définir une attente pour la méthode pull_tweets
sur t
est la définition de 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 comment 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 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, j'aurais pensé utiliser
stubs
était plus approprié que expects
.
- Il peut être utile de séparer la méthode
pull_tweets
(et toute méthode similaire) en une classe TwitterAPI
. De cette façon, il ne semble pas si mauvais que vous devez mettre en place une attente sur le TwitterAPI
dans le test.
J'espère que cela aidera.
Avez-vous travaillé la réponse encore? Est-ce que ma réponse m'a aidé? –