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é?

Était-ce utile?

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

  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, je l'aurais pensé à l'aide stubs était plus approprié que expects.
  3. Il pourrait être utile de séparer la méthode pull_tweets (et des méthodes similaires) dans une classe de TwitterAPI. De cette façon, il ne semble pas si mauvais que vous avez besoin de mettre en place une attente sur le TwitterAPI 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top