Ad esempio, mi piacerebbe convalidare che il nome sia solo lettere ed abbia una lunghezza compresa tra 4 e 14 lettere. Ho il seguente codice nel modello:
validates: name, :format => { :with => /^[a-zA-Z]+$/,
:message => 'Name should be letters only. },
:length => { :minimum => 4, :maximum => 14 }
Quindi mi consente chiaramente di fare ciò che voglio.
Ma per quanto riguarda i test unitari, ho un po 'troppo perfezionismo, quindi ho impostato qualcosa come
invalid_names = ['1234',
'qwe',
'1%#$#$',
'Sam1',
'%',
random_string(15)] #I also have a test method to create random string with parametrized length
valid_names = %w['test',
'Travis',
'John',
random_string(5),
random_string(14),
random_string(4)]
e testare ciascuno di essi in un ciclo con asserzioni, come
invalid_names.each do |name|
user = User.new(:name => name)
user.save
assert user.errors[:name].any?, "#{name} is valid."
end
Quindi funziona sicuramente alla grande. Ma è troppo prolisso (a causa di array di nomi validi / non validi e aggiunto il metodo random_string
), inoltre non posso essere sicuro che il mio test verifichi effettivamente tutti i simboli e le loro combinazioni possibili e tutte le lunghezze e cose, anche se sono decisamente sicuro che funzioni come previsto.
Quindi qual è il modo accettabile per testare la mia convalida senza essere troppo perfezionista, lasciando comunque la maggior parte della logica testata?
Sono appena finito in un trucco mentale per cercare di scrivere un codice perfetto solo per scrivere un codice perfetto e per dimenticare l'obiettivo principale: prodotto funzionante?