Testear ActiveRecord sin Rails 2009-03-19

Hace unos días andaba algo ocioso y me puse a probar como escribir un plugin/gema para rails. Este plugin resultó en una muy sencilla extensión para modelos ActiveRecord, que simplemente mantiene una copia de los valores inversos de created_at y updated_at como enteros, con lo que podemos hacer consultas ordenando por estos campos de forma descendente.

Nada sofisticado. Pero a la hora de escribir los tests me encontré con que quería hacer esos tests independientes de Rails, pues solo afectan a ActiveRecord, y sin necesidad de ningún tipo de configuración. Para ello utilicé varios modelos de ActiveRecord y como base de datos sqlite.

Primero definimos un schema con las tablas de nuestros modelos:

  1. ActiveRecord::Schema.define(:version => 0) do  
  2.   create_table :with_created_models:force => true do |t|  
  3.     t.column :something:string      
  4.     t.column :created_at:datetime  
  5.     t.column :updated_at:datetime      
  6.     t.column :created_at_inverse:integer  
  7.   end  
  8. end  

Una vez definido el schema, establecemos nuestro entorno de test, por ejemplo en test_helper.rb:

  1. require 'test/unit'  
  2.   
  3. require 'rubygems'  
  4. require 'active_record'  
  5. require 'shoulda'  
  6.   
  7. require File.dirname(__FILE__) + '/../lib/inverse_sortable'  
  8.   
  9. ActiveRecord::Base.establish_connection({  
  10.     :adapter => "sqlite3",  
  11.     :dbfile => "test/test.db"  
  12. })  
  13.   
  14. class WithCreatedModel < ActiveRecord::Base  
  15. end  
  16.   
  17. load(File.dirname(__FILE__) + "/schema.rb")  

En este fichero, le decimos a ActiveRecord que utilice como base de datos un fichero de sqlite (test.db), definimos un modelo correspondiente a la tabla en nuestro schema.rb (declarando una clase que hereda de ActiveRecord::Base y con el nombre de la tabla en singular) y por último cargamos dicho schema.

Con esto ya disponemos de un modelo que podemos usar para testear el comportamiento de la extensión inverse_sortable, por ejemplo en inverse_sortable_test.rb:

  1. require File.join(File.dirname(__FILE__), 'test_helper')  
  2.   
  3. class WithCreatedModel  
  4.   acts_as_inverse_sortable  
  5. end  
  6.   
  7. class InverseSortableTest < Test::Unit::TestCase  
  8.   context "A model that acts as an inverse sortable" do      
  9.     should "have the inverse of its created_at time when is created if created_at_inverse is available" do  
  10.       with_created = WithCreatedModel.create(:something => "Testing")  
  11.         
  12.       assert_not_nil with_created.created_at_inverse  
  13.       assert_equal -with_created.created_at.to_i, with_created.created_at_inverse  
  14.     end  
  15.     # ...  
  16. end  

Para quién pueda interesar, tanto el plugin como los tests están en http://github.com/alvarobp/inverse_sortable, donde además hay un pequeño benchmark, sobre lo cual quizá comente en otro post.

blog comments powered by Disqus