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:
ActiveRecord::Schema.define(:version => 0) do
create_table :with_created_models, :force => true do |t|
t.column :something, :string
t.column :created_at, :datetime
t.column :updated_at, :datetime
t.column :created_at_inverse, :integer
end
end
Una vez definido el schema, establecemos nuestro entorno de test, por ejemplo en test_helper.rb:
require 'test/unit'
require 'rubygems'
require 'active_record'
require 'shoulda'
require File.dirname(__FILE__) + '/../lib/inverse_sortable'
ActiveRecord::Base.establish_connection({
:adapter => "sqlite3",
:dbfile => "test/test.db"
})
class WithCreatedModel < ActiveRecord::Base
end
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:
require File.join(File.dirname(__FILE__), 'test_helper')
class WithCreatedModel
acts_as_inverse_sortable
end
class InverseSortableTest < Test::Unit::TestCase
context "A model that acts as an inverse sortable" do
should "have the inverse of its created_at time when is created if created_at_inverse is available" do
with_created = WithCreatedModel.create(:something => "Testing")
assert_not_nil with_created.created_at_inverse
assert_equal -with_created.created_at.to_i, with_created.created_at_inverse
end
# ...
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.