Testeando una app que usa la API de Google, inicializar los fixtures es, como es de esperarse, lento.
Por ejemplo, hay un modelo que al ser creado genera una Google Calendar
class Cosa < ActiveRecord::Base after_create :google_calendar, unless: "no_api" attr_accessor :no_api#not to have to call Google API in tests end
Como vemos, hice el callback condicional, de modo que en la mayoría de los cosas – cuando no estoy testeando asuntos relacionados a la API de Google – inicializo los fixtures con esta propiedad en true en FactoryGirl
factory :cosa do no_api true end
y para aquellos que necesito, lo activo
factory :cosa_google do no_api false end
lo cual por lo menos deja los tests usables
Finished tests in 98.983324s, 0.9092 tests/s, 2.4449 assertions/s.
Pero igual los tests de la API en sí se están demorando harto… ¿no podrían inicializarse fixtures una sola vez para todo un TestCase?
Ahí es donde entra RunningMan, una gema que se inserta en el ciclo de armado de los fixtures para hacer exactamente ésto.
En el Gemfile
gem 'running_man'
$ bundle install
y luego en los TestCase relacionados a la API
require 'test_helper' RunningMan.setup_on ActiveSupport::TestCase class MiTest < ActionController::TestCase #inicialización única setup_once do @cosa = FactoryGirl.create(:cosa_google) end #tests def test_1 assert_not_nil @cosa end def test_2 #etc end end
(Ésta es la sintaxis que funcionó en ActionController, al parecer para los tests de modelos hay una más limpia)
Finished tests in 65.865794s, 1.3664 tests/s, 3.5223 assertions/s.
Como vemos el tiempo bajó de 98s a 65s. Comor referencia, sin tests de API se toma 21s. Es decir la diferencia no es menor, sobre todo considerando que sólo tengo un par de tests de API aún.