Domanda

Sto usando Mocha e factory_girl in JRuby applicazione Rails. Quando chiamo la fabbrica Vorrei restituire gli oggetti con un po 'beffardo già fatto. Ecco un frammento di codice di quello che sto cercando di fare.

Factory.define :tweet_feed_with_tweets, :parent => :tweet_feed do |t|
  t.expects(:pull_tweets).returns([Factory.build(:status),Factory.build(:status)])
end

Perché non voglio che la mia unità e test funzionali per tirare in realtà dal Twitter API voglio stub il metodo in modo da restituire quello che voglio. Ma, questo non sta funzionando. L'oggetto ritorna senza alcuna stubbing fatto. C'è un modo per effettivamente avere spegnendo eseguita su un oggetto creato con la ragazza in fabbrica prima che venga restituito a voi?

È stato utile?

Soluzione

Guardando il codice di documentazione e sorgente per factory_girl, sembra che l'oggetto ceduto al blocco (t, nel tuo esempio) è un esempio di un Factory e non un'istanza dell'oggetto che si vuole costruire (la tweet_feed_with_tweets, nel tuo esempio). Ciò significa che l'impostazione prevedono, per il metodo pull_tweets su t sta impostando l'attesa per l'istanza Factory e non sull'oggetto che saranno costruiti quando si chiama Factory(:tweet_feed_with_tweets). Penso che questo spiega perché il tuo esempio non funziona come previsto.

I può essere sbagliato, ma non riesco a vedere un modo di aggiungere l'attesa all'interno del blocco Factory.define. Probabilmente avete già pensato a questo, ma penso che sarebbe meglio aggiungere l'attesa nel test dopo aver costruito l'istanza: -

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

Se avete bisogno di questo in più posti, è possibile estrarre in un metodo: -

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

Un paio di altri pensieri: -

  1. Credo che l'impostazione delle aspettative in un posto così nascosto è probabilmente una cattiva idea comunque.
  2. Se avete intenzione di farlo, avrei pensato che utilizzando stubs era più adatto di expects.
  3. Può essere utile che separa il metodo pull_tweets (ed eventuali metodi simili) in una classe TwitterAPI. In questo modo non sembrerebbe così male che è necessario istituire un'aspettativa sul TwitterAPI nel test.

spero che alcuni di che aiuta.

Altri suggerimenti

callback sono ora disponibili:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top