La meilleure façon de valider et de tester les Rails de 3 associations (à l'aide de RSpec/Remarquable)?
Je suis encore assez nouveau pour les tests dans Rails 3, et je l'utilise RSpec et Remarquable. J'ai lu beaucoup de posts et quelques livres déjà, mais je suis toujours coincé dans l'incertitude quand à utiliser le nom de l'association, lors de son ID.
class Project < ActiveRecord::Base
has_many :tasks
end
class Task < ActiveRecord::Base
belongs_to :project
end
À cause de la bonne pratique, je veux protéger mes attributs à partir de la masse de travaux:
class Task < ActiveRecord::Base
attr_accessible :project # Or is it :project_id??
belongs_to :project
end
Tout d'abord, je veux faire en sorte qu'un projet jamais existe sans une tâche valide:
class Task < ActiveRecord::Base
validates :project, :presence => true # Which one is the...
validates :project_id, :presence => true # ...right way to go??
end
Je veux aussi assurez-vous que le projet ou l'ID de projet est toujours valable:
class Task < ActiveRecord::Base
validates :project, :associated => true # Again, which one is...
validates :project_id, :associated => true # ...the right way to go?
end
...et de faire j'ai besoin de la validation :présence lorsque j'utilise :associé??
Merci beaucoup pour clarifier, il semble que, après des heures de lecture et d'essayer de tester des trucs à l'aide de RSpec/Shoulda/Remarquable, je ne vois pas la forêt en raison de tous les arbres de plus...
- Belle question claire. Pour confirmer, n'avez-vous pas dire que vous voulez ", assurez-vous qu'un groupe de jamais il existe sans un valide (parent) de projet"?
Vous devez vous connecter pour publier un commentaire.
Cela semble être la bonne façon de le faire:
Vous n'avez pas à mettre
:project
là, aussi! C'est de toute façon possible de le fairetask.project=(Project.first!)
Puis vérifier l'existence de la
:project_id
à l'aide de la suite (:project_id
est également défini lors detask.project=(...)
est utilisé):Maintenant, assurez-vous qu'un Projet est valide comme ceci:
Donc:
C'est un peu dommage que lors de l'affectation d'un ID de
t.project_id =
il n'est pas vérifié si ce numéro existe vraiment. Vous devez vérifier cela en utilisant une mesure de la validation ou à l'aide de la Valide l'Existence GEM.Pour tester ces associations à l'aide de RSpec Remarquable avec les allumettes, faire quelque chose comme:
validates :project, :presence => true
mais pas:associated
de validation. Dans la console, créer une nouvelle tâche avec project_id=999 et vérifier si elle est.valid?
. Rails semble pour l'enregistrement dans la table de projets, puis (sans doute parce qu'il ne l'est pas et project_id est toujours nul), la validation échoue. Maintenant, changez la validation devalidates :project_id, :presence => true
. Rails de ne PAS lire les projets et la validation réussit. Ajouter:associated
et la validation toujours réussit.:project, :presence => true
), il échoue à la validation si la project_id n'existe pas dans la table de projets. Mais si vous validez présence sur l'id (:project_id, :presence => true
),.valid?
retournetrue
n'importe quelle valeur que vous attribuez à project_id. L'ajout devalidates :project, :associated => true
n'est pas de l'aide, il accepte toujours inexistante project_ids. Assez confus au sujet de la façon dont on est censé valider les associations!EDIT: en supposant que l'association n'est pas une option...
La seule façon que je peux obtenir de bien valider est ceci:
La première ligne valide le fait que le Projet associé est valide, si il y en a un. La deuxième ligne insiste sur le
project_id
à être présent, à moins que le Projet existe et est nouveau (si c'est un nouveau record, il ne sera pas encore d'IDENTIFIANT). Le troisième ligne s'assure que le Projet est présent si il y a un ID présent, c'est à dire, si le Projet a déjà été enregistré.ActiveRecord attribuera un
project_id
à la tâche si vous affectez un Projet enregistré àproject
. Si vous affectez un non enregistrées/nouveau Projet deproject
, il va laisserproject_id
vide. Ainsi, nous voulons nous assurer queproject_id
est présent, mais uniquement lorsque vous traitez avec un Projet enregistré; ceci est accompli en ligne deux ci-dessus.À l'inverse, si vous attribuez un numéro à
project_id
, qui constitue un véritable Projet, ActiveRecord de remplirproject
correspondant à l'objet du Projet. Mais si l'ID que vous avez attribué est faux, il va laisserproject
comme nul. Ainsi, la ligne de trois-dessus, ce qui garantit que nous avons unproject
siproject_id
est rempli -- si vous fournissez un faux ID, ce sera un échec.Voir RSpec exemples pour tester ces validations: https://gist.github.com/kianw/5085085
Joshua Muheim la solution fonctionne, mais je déteste ne pas être en mesure de simplement un lien vers un projet d'une tâche avec un id comme ceci:
Alors je suis venu avec ceci à la place: