let es funcional ya que es esencialmente un Proc. También está en caché.
Un problema que encontré de inmediato con let ... En un bloque Spec que está evaluando un cambio.
let(:object) {FactoryGirl.create :object}
expect {
post :destroy, id: review.id
}.to change(Object, :count).by(-1)
Deberá asegurarse de llamar let
fuera de su bloque esperado. es decir, está llamando FactoryGirl.create
en su bloque let. Normalmente hago esto verificando que el objeto persiste.
object.persisted?.should eq true
De lo contrario, cuando let
se llama al bloque por primera vez, se producirá un cambio en la base de datos debido a la instanciación diferida.
Actualizar
Solo agrego una nota. Tenga cuidado jugando código golf o en este caso rspec golf con esta respuesta.
En este caso, solo tengo que llamar a algún método al que responda el objeto. Entonces invoco el _.persisted?
método _ en el objeto como verdadero. Todo lo que intento hacer es crear una instancia del objeto. ¿Podrías llamar vacío? o nulo? también. El punto no es la prueba, sino traer el objeto a la vida llamándolo.
Entonces no puedes refactorizar
object.persisted?.should eq true
ser - estar
object.should be_persisted
como el objeto no ha sido instanciado ... es vago. :)
Actualización 2
aprovechar el let! sintaxis para la creación instantánea de objetos, lo que debería evitar este problema por completo. Tenga en cuenta, sin embargo, que derrotará mucho el propósito de la pereza del let no golpeado.
También, en algunos casos, es posible que desee aprovechar la sintaxis del tema en lugar de permitir, ya que puede ofrecerle opciones adicionales.
subject(:object) {FactoryGirl.create :object}