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.

Este sitio utiliza cookies.    Leer más