2011-04-06 30 views
5

Tengo before_validation :do_something, :on => :create en uno de mis modelos.¿Hay alguna manera de probar devoluciones de llamada `before_validation` con un argumento`: on` en Rails?

Quiero probar que esto suceda, y no ocurre en :save.

¿Hay una manera sucinta de probar esto (utilizando los carriles 3, Mocha y Shoulda), sin hacer algo como:

context 'A new User' do 
    # Setup, name test etc 
    @user.expects(:do_something) 
    @user.valid? 
end 

context 'An existing User' do 
    # Setup, name test etc 
    @user.expects(:do_something).never 
    @user.valid? 
end 

No puedo encontrar nada en la API de la debería, y esto se siente bien in- DRY ...

¿Alguna idea? Gracias :)

+0

OK, en caso de que encuentre un matcher/write one o alguien aparezca uno para: before_validation, asegúrese de usar esta técnica simple de este [post] (http://stackoverflow.com/questions/3134066/ shoulda-rspec-matchers-on-create/5372151 # 5372151) para resolver el bit que se debe hacer con: on => create. Una solución bastante simple usando el bloque "sujeto". – jake

Respuesta

9

Creo que debe cambiar su enfoque. Está probando que Rails está funcionando, no es que su código funcione con estas pruebas. Piense en probar su código en su lugar.

Por ejemplo, si tuviera esta clase en lugar estúpida:

class User 
    beore_validation :do_something, :on => :create 

    protected 

    def do_something 
    self.name = "#{firstname} #{lastname}" 
    end 
end 

De hecho, me probarlo de esta forma:

describe User do 
    it 'should update name for a new record' do 
    @user = User.new(firstname: 'A', lastname: 'B') 
    @user.valid? 
    @user.name.should == 'A B' # Name has changed. 
    end 

    it 'should not update name for an old record' do 
    @user = User.create(firstname: 'A', lastname: 'B') 
    @user.firstname = 'C' 
    @user.lastname = 'D' 
    @user.valid? 
    @user.name.should == 'A B' # Name has not changed. 
    end 
end 
+0

Aunque estoy completamente de acuerdo con su afirmación anterior, su solución sugerida podría no ser la manera más concisa. Piénselo desde la perspectiva de, no quiero probar el método: do_something en sí mismo. (Esto bien podría ser un método público en la llamada que es más complejo y podría simplemente probarse directamente) Pero quiero probar dónde está realmente conectado en la devolución de llamada anterior a la validación. Creo que algunos de los matdadores deberían tener este enfoque. – jake

+0

Pero de nuevo si: do_something es un método privado destinado solo para este propósito, ¿estoy de acuerdo en probar el efecto general save/or valid? es el camino correcto a seguir. Esto también hará que las pruebas no se rompan en caso de que decida no usar el enfoque de devolución de llamada por completo. En cualquiera de los casos, es importante no intentar probar el marco. – jake

Cuestiones relacionadas