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?

¿Fue útil?

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

  1. Creo que el establecimiento de expectativas en un lugar escondido es probablemente una mala idea de todos modos.
  2. Si va a hacerlo, yo habría pensado que el uso de stubs era más apropiado que expects.
  3. Podría valer la pena separar el método pull_tweets (y cualquier métodos similares) en una clase TwitterAPI. De esa manera no parecería tan mala que es necesario establecer una expectativa en el TwitterAPI 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top