2012-06-11 22 views
6

Tengo un modelo de ActiveRecord que tiene algunas devoluciones de llamada y validaciones personalizadas que quiero probar. Significa que tengo que hacer que todos sean públicos. ¿Es una buena práctica o hay una mejor solución en este caso?Ruby on Rails: ¿deberían todos mis métodos de devolución de llamada de ActiveRecord ser privados?

Los ejemplos de los métodos que desea probar:

def before_validation 
    original.edit(self) if original 
    end 

    validate :unique?, on: :create 

    def unique? 
    return true if original.blank? 
    errors.add(:base, 'The entry already exists') 
    false 
    end 

En otras palabras:

  1. Si quiero probar el método "before_validation", ¿tengo que hacerlo público y llamar a test_object .antes de la validación directamente en mi modelo Rspec?
  2. Si quiero probar no solo, ese método de validación personalizado único?() Se invoca en la validación, pero también, el método en sí mismo, ¿tengo que hacer también el único?() Público también?

El problema es que ninguno de estos métodos estoy usando fuera de mi modelo (por lo que deberían ser privados), pero ¿cómo podría probarlos sin hacerlos públicos?

Respuesta

3

Es fácil quedar atrapado en la implementación de pruebas, pero este es un buen candidato para el comportamiento de las pruebas.

Pregúntate a ti mismo, ¿qué estás haciendo realmente antes de la validación? Luego hazte una prueba de que, dadas ciertas entradas, obtendrás ciertos resultados si y solo si tu validación previa funciona.

Como un simple ejemplo, imagine que tiene un modelo de usuario con un simple atributo name, y usted tiene un before_validation que simplemente hace:

name = "Auto-generated name." if name.blank? 

entonces se podría escribir una prueba de esta manera:

it "gets an auto-generated name if none is specified." do 
    user = User.create! 
    user.name.should eq "Auto-generated name." 
end 

it "does not get an auto-generated name if one is specified." do 
    user = User.create!(:name => "Test Name") 
    user.name.should eq "Test Name" 
end 

Como puede ver, esta prueba prueba la validación, pero no necesita ser pública, ya que solo está probando el comportamiento de la misma. Lo mismo aplica para su método unique?. Déle ciertas entradas y pruebe el comportamiento, sin tener que preocuparse por qué método específico se utilizó o cualquier otro detalle de implementación.

Cuestiones relacionadas