2011-09-28 11 views
5

Siento que me falta algo. Estoy escribiendo una gema de rubí que permite la interacción con el registro activo como complemento de su función principal.Falsificar un modelo de registro activo sin db

Al escribir casos de prueba para ello, necesito poder especificar modelos de registros activos ficticios para probar esta funcionalidad. Sería excelente si pudiera obtener una instancia de un modelo de registro activo que no necesitara ninguna conexión a un archivo db, que pudiera tener relaciones, todo eso, pero no me requiriera configurar tablas en una base de datos. Soy bastante nuevo en las pruebas, y aparte de las pruebas de rieles, soy bastante nuevo, pero parece que debería ser capaz de hacer algo así con bastante facilidad, pero no estoy encontrando nada.

¿Alguien me puede decir lo que me estoy perdiendo? He visto fábricas, fabricantes, accesorios, todos ellos parecen querer alcanzar el DB. ¿Cómo evalúan las gemas las personas donde necesita el objeto AR solo para las pruebas?

Respuesta

8

Parece que usted necesita NullDB:

NullDB es el patrón de objeto nulo tal como se aplica a los adaptadores de base de datos de ActiveRecord. Es un backend de base de datos que traduce las interacciones de la base de datos en operaciones no operativas. El uso de NullDB le permite probar la lógica comercial de su modelo, incluidos los hook after_save, sin tocar una base de datos real.

+0

eso es exactamente lo que estaba buscando. ¡Gracias! –

+0

Una desventaja de esta biblioteca es la forma en que se acopla a Rspec. Algo a tener en cuenta si usted no está usando Rspec –

+0

1 de mi lado ... –

2

Otros han tenido este mismo problema. Mi toma habitual es utilizar una biblioteca burlona para pruebas unitarias y escribir algunas funcionales con accesorios para complementarlas en configuraciones demasiado complejas para simularlas (lo cual debes evitar de cualquier forma).

O utilice una biblioteca de reemplazo para AR que proporciona la misma interfaz pero no requiere una base de datos. No he usado rieles en algún momento, pero solía haber algunos disponibles. Esto no es completamente sin los mismos problemas que usar un DB en primer lugar, ya que estas bibliotecas generalmente tienen otros requisitos (como servidores web, LDAP, ...), o simplemente necesitan el mismo trabajo de configuración de registros que los simulacros.

O péguelo y solo use accesorios, pero reduzca su costo utilizando una base de datos sqlite en memoria solo para pruebas y migraciones adecuadas.

+0

usted hace un buen punto. Una pequeña sqlite db sería una buena alternativa. –

2

Sí, quería volver a hacer esto un tiempo en Rails 2.3 y era un gran dolor de cabeza burlón. Creo que ahora es más fácil con ActiveModel, que le proporciona una interfaz explícita, si quiere hacer su propia versión.

Además, no lo he usado, pero Josh Susser tiene una joya que te permite combinar el comportamiento de AR-ish en cualquier clase. Parece orientado hacia el uso de objetos simples de rubí en formas, pero probablemente también sea útil para pruebas unitarias. Ver informal.

Se habla de ello en una reciente Ruby Rogues episode

+0

looks informales realmente genial. De hecho, podría usar esto para otra cosa, gracias por señalarlo. –

1

Otra opción es usar un adaptador sqlite3 y ejecutar la base de datos en la memoria, y utilizar un DatabaseCleaner para deshacerse de los registros después de la prueba.

Este enfoque tiene ciertas ventajas:

  • se puede ver el SQL en la prueba, que simplifica el proceso de optimización de consultas
  • que está cerca de los ejemplos de la "vida real"

En Por otra parte, debo decir que es un poco complicado, ya que es un poco largo, pero no dude en reestructurarlo;)

Aquí se presenta una breve descripción de lo que necesita fo r que:

# in Gemfile 
gem "activerecord" #since you are dealing with activerecord 
gem "database_cleaner", :group => :test 
gem "sqlite3", :group => :test 

estoy usando el siguiente método para mantener la cosa, sino que son bienvenidos a tener de otra manera:

# in RAILS_ROOT/test/support/active_record.rb 
require 'logger' 

ActiveRecord::Base.establish_connection(
    :adapter => "sqlite3", :database => ':memory:' 
) 

#this line will print the SQL queries right into console 
ActiveRecord::Base.logger = Logger.new(STDOUT) 

# in RAILS_ROOT/test/support/database_cleaner.rb 
require 'database_cleaner' 
DatabaseCleaner.strategy = :truncation 
# or DatabaseCleaner.strategy = :trunsaction (it is up to you) 

module OrmSetup 
    def before_setup 
    DatabaseCleaner.start 
    end 

    def after_teardown 
    DatabaseCleaner.clean 
    end 
end 

# in RAILS_ROOT/test/test_helper.rb 
... 
require File.expand_path("support/active_record", File.dirname(__FILE__)) 
require File.expand_path("support/database_cleaner", File.dirname(__FILE__)) 

class Test::Unit::TestCase 
    include OrmSetup 
end 

Y ahora en su prueba puede tener algo como

require 'test_helper' 

class User < ActiveRecord::Base 
end 

class MyFancyTest < Test::Unit::TestCase 
    def setup 
    before_setup 
    end 

    def teardown 
    after_teardown 
    end 
end 
Cuestiones relacionadas