Ho iniziato il mio viaggio con TDD in Rails e ho riscontrato un piccolo problema relativo ai test per le convalide dei modelli a cui non riesco a trovare una soluzione. Diciamo che ho un modello User,Rails 3.1, RSpec: convalida delle convalide del modello
class User < ActiveRecord::Base
validates :username, :presence => true
end
e un semplice test
it "should require a username" do
User.new(:username => "").should_not be_valid
end
Questa verifica correttamente la convalida presenza, ma cosa succede se voglio essere più preciso? Ad esempio, full_messages test sugli errori oggetto ..
it "should require a username" do
user = User.create(:username => "")
user.errors[:username].should ~= /can't be blank/
end
mia preoccupazione per il tentativo iniziale (usando should_not be_valid) è che RSpec non produrrà un messaggio di errore descrittivo. Dice semplicemente "atteso valido? Per restituire falso, diventa vero". Tuttavia, il secondo esempio di test ha un piccolo inconveniente: utilizza il metodo create al posto del nuovo metodo per ottenere l'oggetto errors.
Vorrei che i miei test fossero più specifici su ciò che stanno testando, ma allo stesso tempo non devono toccare un database.
Qualcuno ha qualche input?
Grazie mille Matthew. C'è un modo per avvicinarmi all'errore che sto provando a testare? X.should_not be_valid sembra così generico per me, e chissà se qualcos'altro in fondo renderà il record invalido. Questo test fallirà quindi nel punto sbagliato. A proposito, penso di aver contrassegnato la tua risposta come accettata. Non io? – Feech
Giusto, quindi questo è il motivo per cui discuto per le fabbriche. Scrivi il codice per produrre un utente valido una volta in un posto e poi scrivi un test per assicurarti che sia valido prima di tutti i singoli test che assicurano di poterlo invalidare. In questo modo se per qualche ragione cambi il tuo modello in modo che la fabbrica risulti più lunga produce un utente valido il test 'Factory.build (: user) .should be_valid' fallirà e tu saprai che devi aggiornare la tua fabbrica ... prendila ? (e sì hai accettato la mia risposta7) – Matthew
spiegazione perfetta. Grazie ancora. – Feech