2009-02-25 9 views
1

J'utilise Mocha et Factory_girl dans une application rails JRuby. Quand j'appelle l'usine, je voudrais retourner les objets avec un peu de moquerie déjà fait. Voici un extrait de code de ce que j'essaie de faire.Retour des objets fantaisie d'usine fille

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 aucun talonnage. Existe-t-il un moyen d'effectuer un enchaînement sur un objet créé avec une fille d'usine avant qu'il ne vous soit retourné?

+0

Avez-vous travaillé la réponse encore? Est-ce que ma réponse m'a aidé? –

Répondre

1

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: -

  1. Je pense que la définition des attentes dans un tel endroit caché est probablement une mauvaise idée de toute façon.
  2. Si vous allez le faire, j'aurais pensé utiliser stubs était plus approprié que expects.
  3. 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.

6

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 
Questions connexes