2009-09-26 23 views
6

Estoy buscando un código limpio y corto para probar las validaciones en Rails Unittests.Sintaxis simple para probar Errores de validación

Actualmente hago algo como esto

test "create thing without name" do 
    assert_raise ActiveRecord::RecordInvalid do 
     Thing.create! :param1 => "Something", :param2 => 123 
    end 
end 

supongo que hay una manera mejor que también muestra el mensaje de validación?

Solución:

Mi solución actual sin una marcos adicionales es:

test "create thing without name" do 
    thing = Thing.new :param1 => "Something", :param2 => 123 
    assert thing.invalid? 
    assert thing.errors.on(:name).any? 
end 
+0

Gracias s para las respuestas. Voy a probar rspec y los demás en algún momento. Por ahora, me ayudo con assert (record.invalid?) Y assert_equal ([], record.errors.full_messages) – Roman

Respuesta

6

Usted no menciona qué marco de pruebas que está utilizando. Muchos tienen macros que hacen que test test activerec snap.

Aquí está el "largo camino" para hacerlo sin necesidad de utilizar ningún ayudantes de prueba:

thing = Thing.new :param1 => "Something", :param2 => 123 
assert !thing.valid? 
assert_match /blank/, thing.errors.on(:name) 
+0

Uso solo Rails simples en este momento. – Roman

+1

A partir de Rails 3, no hay un método "encendido" para ActiveModel :: Errors. http://stackoverflow.com/questions/7526499/undefined-method-on-for-actionmodel –

+1

Esta respuesta puede estar fechada, pero 'assert_match' no funciona en una matriz. –

0

podrían darle la rspec-on-rails-matchers intentarlo. Le proporciona una sintaxis como:

@thing.should validates_presence_of(:name) 
+0

La página dice: No me use. Estoy desactualizado y me rompo la espalda. Shoulda ahora trabaja con rspec. Usa eso. – Roman

1

estoy usando Rails 2.0.5, y cuando quiero afirmar que un modelo fallará validación, compruebo el errors.full_messages method y lo comparo con una matriz de mensajes esperados.

created = MyModel.new 
created.field1 = "Some value" 
created.field2 = 123.45 
created.save 

assert_equal(["Name can't be blank"], created.errors.full_messages) 

Para afirmar que la validación tiene éxito, simplemente comparo con una matriz vacía. Puede hacer algo muy similar para verificar que un controlador de Rails no tenga mensajes de error después de una solicitud de creación o actualización.

assert_difference('MyModel.count') do 
    post :create, :my_model => { 
    :name => 'Some name' 
    } 
end 

assert_equal([], assigns(:my_model).errors.full_messages) 
assert_redirected_to my_model_path(assigns(:my_model)) 
1

para aquellos que utilizan los carriles 3.2.1 y, yo prefiero usar el método added?:

assert record.errors.added? :name, :blank 

Puedo usar un ayudante de prueba que tiene este aspecto:

def assert_invalid(record, options) 
    assert_predicate record, :invalid? 

    options.each do |attribute, message| 
    assert record.errors.added?(attribute, message), "Expected #{attribute} to have the following error: #{message}" 
    end 
end 

cual permite para escribir pruebas como esta:

test "should be invalid without a name" do 
    user = User.new(name: '') 

    assert_invalid user, name: :blank 
end 
Cuestiones relacionadas