Volviendo objetos simulados de Factory Girl
-
09-09-2019 - |
Pregunta
Estoy utilizando Mocha y factory_girl en un JRuby carriles de aplicación. Cuando llamo a la fábrica me gustaría devolver los objetos con un poco de burla ya realizado. Aquí es un fragmento de código de lo que estoy tratando de hacer.
Factory.define :tweet_feed_with_tweets, :parent => :tweet_feed do |t|
t.expects(:pull_tweets).returns([Factory.build(:status),Factory.build(:status)])
end
Debido a que no quiero que mi unidad y la prueba de funcionamiento para tirar en realidad de la API de Twitter quiero stub el método de modo que devuelve lo que quiero. Pero esto no está funcionando. El objeto regresa sin tropezar hecho. ¿Hay una manera de realmente han Stubbing realizado sobre un objeto creado con la chica de la fábrica antes de que sea devuelta a usted?
Solución
Mirando el código de la documentación y fuente de factory_girl
, parece que el objeto cedido al bloque (t
, en su ejemplo) es una instancia de una Factory
y no una instancia del objeto que desea construir (el tweet_feed_with_tweets
, en su ejemplo). Esto significa que el establecimiento de una expectativa para el método pull_tweets
en t
está estableciendo la expectativa en la instancia Factory
y no en el objeto que se construye cuando se llama Factory(:tweet_feed_with_tweets)
. Creo que esto explica por qué su ejemplo no está funcionando como se espera.
Puede que me equivoque, pero no puedo ver una manera de añadir la expectativa dentro del bloque Factory.define
. Probablemente ya has pensado en esto, pero creo que sería mejor que la adición de la expectativa en la prueba después de haber construido el ejemplo: -
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 necesita esto en varios lugares, se puede extraer en un método: -
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 par de otros pensamientos: -
- Creo que el establecimiento de expectativas en un lugar escondido es probablemente una mala idea de todos modos.
- Si va a hacerlo, yo habría pensado que el uso de
stubs
era más apropiado queexpects
. - Podría valer la pena separar el método
pull_tweets
(y cualquier métodos similares) en una claseTwitterAPI
. De esa manera no parecería tan mala que es necesario establecer una expectativa en elTwitterAPI
en la prueba.
Espero que algunos de eso ayuda.
Otros consejos
Las devoluciones de llamada están 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