2011-11-03 1 views
0

J'ai une table de contacts dans une application Rails 3.1. Je veux last_name pour accepter 40 caractères, donc dans mon modèle j'ai écrit :length => { :maximum => 40 }. Cependant, une faute de frappe dans ma migration a créé la colonne last_name avec :limit => 30.Utilisez .new ou .create! lors du test des modèles Rails avec Rspec?

Je me demandais pourquoi mon test Rspec n'a pas pris ceci:

it "should allow last_name up to max length" do 
    long_field = "a" * 40 
    Contact.new(@attr.merge(:last_name => long_field)).should be_valid 
end 

je réalise que ça ne vérifie que le modèle. Si j'utilise .create! à la place, le test échoue bien:

it "should allow last_name up to max length" do 
    long_field = "a" * 40 
    Contact.create!(@attr.merge(:last_name => long_field)).should be_valid 
end 

La question est, dois-je toujours utiliser .create! pour tester mes modèles? Ou est-ce trop lent? Sinon, comment puis-je m'assurer que les définitions de mon modèle et de ma base de données ne sont pas en conflit? Cela me demande aussi si je devrais simplement laisser des chaînes comme 255 dans la base de données et vérifier seulement la longueur dans le modèle.

Répondre

2

Vous devriez utiliser .new autant que possible pour des raisons de vitesse. Et pour que votre test échoue, vous devez utiliser validates_length_of. En ce qui concerne la longueur de la chaîne, idéalement ils devraient correspondre et si vous vous sentez excessivement minutieux, vous pouvez reflect on validations et Model.columns pour vérifier que vous avez une validation pour chaque colonne.

+0

Enfin pour revenir aux détails sur celui-ci. J'utilise ': validates: length' au lieu de': validates_length_of', mais l'un ou l'autre laisse passer le test si le test rspec utilise ': new'. En d'autres termes, si le validateur de modèle est correct mais que le champ de base de données est trop court, le test ': new' passe car il n'écrit pas dans la base de données. Je ne pense pas que la réflexion puisse aider car elle ne vérifie pas la base de données. Semble étrange que la migration <-> la synchronisation du modèle est un processus manuel. Jusqu'à présent, ': create!' Est la seule façon que je vois de tester que la DB accepte ce que le modèle va lui donner. –

Questions connexes