Die perfekte Möglichkeit, um Rails 3-Assoziationen zu validieren und zu testen (mit RSpec / Remarkable)?
Ich bin noch ziemlich neu testen in Rails 3, und ich verwende RSpec und Bemerkenswert. Ich Las viele Beiträge und einige Bücher schon, aber ich bin immer noch eine Art stecken in der Unsicherheit, Wann der Verein seinen Namen, als Sie seine ID.
class Project < ActiveRecord::Base
has_many :tasks
end
class Task < ActiveRecord::Base
belongs_to :project
end
Wegen der guten Praxis möchte ich zum Schutz meiner Attribute aus der Masse Aufgaben:
class Task < ActiveRecord::Base
attr_accessible :project # Or is it :project_id??
belongs_to :project
end
Erste von allen, ich will, um sicherzustellen, dass ein Projekt nie existiert, ohne eine gültige Aufgabe:
class Task < ActiveRecord::Base
validates :project, :presence => true # Which one is the...
validates :project_id, :presence => true # ...right way to go??
end
Ich möchte auch, um sicherzustellen, dass die zugewiesene Projekt oder die Projekt-ID ist immer gültig:
class Task < ActiveRecord::Base
validates :project, :associated => true # Again, which one is...
validates :project_id, :associated => true # ...the right way to go?
end
...und muss ich die Validierung auf :Vorhandensein, wenn ich Sie benutze :Zusammenhang??
Vielen Dank für die Klarstellung, es scheint, dass nach Stunden Lesen und probieren und testen Sachen mit RSpec/Shoulda/Bemerkenswerte, das ich nicht sehen den Wald wegen der Bäume nicht mehr...
InformationsquelleAutor der Frage Joshua Muheim | 2012-07-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies scheint der richtige Weg, es zu tun:
Sie nicht haben, um
:project
es auch! Es ist trotzdem möglich, das zu tuntask.project=(Project.first!)
Dann überprüfen Sie für die Existenz der
:project_id
mit den folgenden (:project_id
wird auch gesetzt, wenntask.project=(...)
verwendet wird):Stellen Sie sicher, dass als eine zugeordnete Projekt gilt wie diese:
Also:
Es ist ein bisschen schade, dass bei der Vergabe einer ID durch
t.project_id =
es wird nicht geprüft, ob diese bestimmte ID auch wirklich vorhanden ist. Sie haben zu prüfen, dies über eine benutzerdefinierte Gültigkeitsprüfung oder mit dem Überprüft Existenz JUWEL.Um zu testen, diese Verbände mit RSpec mit Bemerkenswerten Matcher, etwas zu tun:
InformationsquelleAutor der Antwort Joshua Muheim
InformationsquelleAutor der Antwort Yuri Barbashov
EDIT: vorausgesetzt, der Verein ist nicht optional...
Nur so kann ich es gründlich überprüfen, ist dies:
Die erste Zeile überprüft, ob für das Projekt gültig ist, wenn es einen gibt. Die zweite Zeile besteht auf der
project_id
anwesend sind, es sei denn, das assoziierte Projekt existiert und der neue (wenn es einen neuen Rekord, ist es nicht eine ID noch). Die Dritte Zeile sorgt dafür, dass das Projekt vorhanden ist, wenn es eine ID ist vorhanden, D. H., wenn das zugehörige Projekt bereits gespeichert wurde.ActiveRecord weisen eine
project_id
zur Aufgabe ordnen Sie eine gespeicherte Projekt zuproject
. Wenn Sie zuweisen eine unerlöste/neues Projekt zuproject
wird es verlassenproject_id
leer. Damit wollen wir sicherstellen, dassproject_id
ist vorhanden, aber nur, wenn es mit einem Projekt gespeichert; dies erfolgt in Zeile zwei vor.Umgekehrt, wenn Sie eine Nummer zu
project_id
ist ein echtes Projekt, ActiveRecord füllenproject
mit den entsprechenden Projekt-Objekt. Aber wenn die ID, die Sie Ihnen zugeordnet ist falsch, es verlassenproject
als null. So ist die Dritte Zeile oben, die dafür sorgt, dass wir eineproject
wennproject_id
ausgefüllt ist -- wenn Sie eine gefälschte ID, diese wird scheitern.Sehen RSpec Beispiele, testen Sie diese Validierungen: https://gist.github.com/kianw/5085085
InformationsquelleAutor der Antwort Kian Wright
Joshua Muheim ' s Lösung funktioniert, aber ich hasse es, nicht einfach einen link, ein Projekt, eine Aufgabe mit der id so:
Also ich kam mit dieser, statt:
InformationsquelleAutor der Antwort Dany Marcoux