2009-09-26 14 views
6

Sto cercando il codice breve e pulito per verificare le convalide in Rails Unittests.Sintassi semplice per test Errori di convalida

Attualmente faccio qualcosa di simile

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

Credo che ci sia un modo migliore che mostra anche il messaggio di convalida?

Soluzione:

mia soluzione attuale senza ulteriori quadri è:

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

Grazie s per le risposte. Proverò rspec e gli altri un po 'di tempo. Per ora mi aiuto con assert (record.invalid?) E assert_equal ([], record.errors.full_messages) – Roman

risposta

6

Tu non parlare che cosa framework di test che si sta utilizzando. Molti hanno macro che rendono il test activerecord un gioco da ragazzi.

Ecco la "via lunga" per farlo senza l'uso di aiutanti di prova:

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

Al momento utilizzo solo Rails normali. – Roman

+1

A partire da Rails 3 non esiste un metodo "on" per ActiveModel :: Errors. http://stackoverflow.com/questions/7526499/undefined-method-on-for-actionmodel –

+1

Questa risposta potrebbe essere datata, ma 'assert_match' non funziona su un array. –

0

Si potrebbe dare il rspec-on-rails-matchers una prova. Fornisce la sintassi del tipo:

@thing.should validates_presence_of(:name) 
+0

La pagina dice: Non usare me. Non sono aggiornato e mi interrompo. Dovrebbe funzionare con rspec ora. Usalo. – Roman

1

sto usando Rails 2.0.5, e quando voglio affermare che un modello fallirà validazione, controllo lo errors.full_messages method e lo confronta con un array di messaggi previsti.

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

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

Per affermare che la convalida ha esito positivo, mi confronto a un array vuoto. Puoi fare qualcosa di molto simile per verificare che un controller di Rails non abbia messaggi di errore dopo una richiesta di creazione o aggiornamento.

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

per coloro che utilizzano Rails 3.2.1 e fino, io preferisco usare il metodo added?:

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

Io uso un aiutante di prova che assomiglia a questo:

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 

che permette Io scrivo test come questo:

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

    assert_invalid user, name: :blank 
end 
Problemi correlati