Tornando oggetti mock da Factory Girl
-
09-09-2019 - |
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?
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: -
- Credo che l'impostazione delle aspettative in un posto così nascosto è probabilmente una cattiva idea comunque.
- Se avete intenzione di farlo, avrei pensato che utilizzando
stubs
era più adatto diexpects
. - Può essere utile che separa il metodo
pull_tweets
(ed eventuali metodi simili) in una classeTwitterAPI
. In questo modo non sembrerebbe così male che è necessario istituire un'aspettativa sulTwitterAPI
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