Wie man den rspec Put-Controller-Test von Scaffold abschließt
Ich bin mit Gerüst zu generieren rspec-controller-tests. Standardmäßig schafft es der test:
let(:valid_attributes) {
skip("Add a hash of attributes valid for your model")
}
describe "PUT update" do
describe "with valid params" do
let(:new_attributes) {
skip("Add a hash of attributes valid for your model")
}
it "updates the requested doctor" do
company = Company.create! valid_attributes
put :update, {:id => company.to_param, :company => new_attributes}, valid_session
company.reload
skip("Add assertions for updated state")
end
Mit FactoryGirl, ich habe diese gefüllt mit:
let(:valid_attributes) { FactoryGirl.build(:company).attributes.symbolize_keys }
describe "PUT update" do
describe "with valid params" do
let(:new_attributes) { FactoryGirl.build(:company, name: 'New Name').attributes.symbolize_keys }
it "updates the requested company", focus: true do
company = Company.create! valid_attributes
put :update, {:id => company.to_param, :company => new_attributes}, valid_session
company.reload
expect(assigns(:company).attributes.symbolize_keys[:name]).to eq(new_attributes[:name])
Dies funktioniert, aber es scheint, wie ich sollte in der Lage sein, alle zu testen Attribute, anstatt nur zu testen, wird der geänderte name. Ich habe versucht, die änderung der letzten Zeile:
class Hash
def delete_mutable_attributes
self.delete_if { |k, v| %w[id created_at updated_at].member?(k) }
end
end
expect(assigns(:company).attributes.delete_mutable_attributes.symbolize_keys).to eq(new_attributes)
Dass fast geklappt, aber ich bekomme die folgende Fehlermeldung von rspec mit BigDecimal Felder:
-:latitude => #<BigDecimal:7fe376b430c8,'0.8137713195 830835E2',27(27)>,
-:longitude => #<BigDecimal:7fe376b43078,'-0.1270954650 1027958E3',27(27)>,
+:latitude => #<BigDecimal:7fe3767eadb8,'0.8137713195 830835E2',27(27)>,
+:longitude => #<BigDecimal:7fe3767ead40,'-0.1270954650 1027958E3',27(27)>,
Verwendung von rspec, factory_girl, und das Baugerüst ist unglaublich Häufig, so meine Fragen sind:
Was ist ein gutes Beispiel für eine rspec und factory_girl test für eine PUT-update mit Gültiger params?
Ist es erforderlich, dass attributes.symbolize_keys
und zum löschen der veränderlichen lösen? Wie bekomme ich diese BigDecimal-Objekte zu bewerten, wie eq
?
InformationsquelleAutor der Frage dankohn | 2014-07-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, so das ist, wie ich tun, ich behaupte nicht, strikt befolgen Sie die best practices, sondern konzentriere mich auf Präzision meiner tests, die Klarheit der meinen code, und die schnelle Ausführung meiner suite.
So nehmen Beispiel einer
UserController
1- ich nicht verwenden, FactoryGirl Attribute definieren, um post zu meinem controller, da ich gerne für mich behalten die Kontrolle über diese Attribute. FactoryGirl ist nützlich, um aufzuzeichnen, aber Sie sollte immer manuell die Daten, die an der operation beteiligt, die Sie testen, es ist besser für die Lesbarkeit und Konsistenz.
In diesem Zusammenhang werden wir manuell definieren gepostet Attribute
2- ich Dann definieren Sie die Attribute erwarte ich für den aktualisierten Datensatz, es kann eine exakte Kopie der gesendeten Attribute, aber es kann sein, dass der controller einige zusätzliche Arbeit, und wir wollen auch testen. Also sagen wir mal für unser Beispiel, dass einmal unsere Benutzer aktualisiert seine persönlichen Informationen unserer Steuerung automatisch hinzufügen
need_admin_validation
FlaggeDas ist auch, wo Sie hinzufügen können, die Behauptung für die attribute, die unverändert bleiben müssen. Beispiel mit dem Feld
age
aber es kann alles sein3- ich die Aktion definieren, die in einem
let
block. Zusammen mit den vorangegangenen 2let
ich finde es macht meine Angaben sehr gut lesbar ist. Und es auch einfach zu schreiben shared_examples4- (ab diesem Punkt ist alles in gemeinsame Beispiel und benutzerdefinierte rspec-Matcher in meinen Projekten) Zeit, um den ursprünglichen Datensatz, für die, die wir verwenden können, FactoryGirl
Wie Sie sehen können wir manuell setzen Sie den Wert für
age
wie wollen wir überprüfen, ob es nicht ändern, während derupdate
Aktion. Auch wenn das Werk bereits im Alter von 25 habe ich immer überschreiben also mein test wird nicht brechen, wenn ich die Fabrik.Zweite Sache zu beachten: wir verwenden hier
let!
mit einem Knall. Das ist, weil manchmal möchten Sie vielleicht zu test-controller fail Aktion, und der beste Weg das zu tun ist, um auszudrückenvalid?
aus und gibt false zurück. Sobald Sie stubvalid?
Sie können nicht erstellen Sie Datensätze für die gleiche Klasse mehr, dafürlet!
mit einem Knall schaffen würde, den Rekord vor der stubvalid?
5- Die Behauptungen selbst (und schließlich die Antwort auf Ihre Frage)
Zusammenfassen Also addition aller oben, dies ist, wie die Skillung aussieht
assert_record_values
ist der Helfer, um Ihren rspec einfacher.Wie Sie sehen können, mit diesem einfachen Helfer, wenn wir erwarten, dass für eine
BigDecimal
können wir nur Folgendes schreiben, und der Helfer den rest machenAlso am Ende, und zum Abschluss, wenn Sie geschrieben haben, Ihre shared_examples, Helfer und benutzerdefinierten Matcher, können Sie Ihre Spezifikationen super TROCKEN. Sobald Sie beginnen, wiederholen die gleiche Sache, die in Ihrem Controller-Spezifikationen, finden, wie können Sie diese umgestalten. Es kann einige Zeit dauern, aber wenn Ihre getan, können Sie schreiben die tests für einen ganzen controller in wenigen Minuten
Und ein letztes Wort (ich kann nicht aufhören, ich Liebe Rspec) hier ist, wie voll meine Helfer Aussehen. Es ist verwendbar für alles, was in der Tat, nicht nur Modelle.
InformationsquelleAutor der Antwort Benj
Dies ist der Fragende posting. Ich hatte zu gehen, down the rabbit hole ein bisschen Verständnis mehrere, sich überlappende Themen hier, also ich wollte gerade Bericht erstatten über die Lösung, die ich gefunden.
tldr; Es ist zu viel Mühe zu versuchen, um zu bestätigen, dass jedes wichtige Attribut kommt wieder unverändert aus einer PUT. Einfach überprüfen, ob das changed-Attribut ist das, was Sie erwarten.
Die Probleme, die ich gestoßen:
(Factory.build :company).attributes.symbolize_keys
die windet sich neue Probleme zu schaffen.Date.inspect
nicht zeigen Millisekunden.Hier ist die Hash-Methode, die gehen in rails_spec.rb:
Alternativ (und vielleicht vorzugsweise) könnte ich geschrieben haben, eine benutzerdefinierte rspec-matcher als durchläuft jedes Attribut und vergleicht deren Werte einzeln, die gearbeitet haben würde, um das Datum-Problem. Das war der Ansatz der
assert_records_values
Methode unten die Antwort, die ich ausgewählt durch @Benjamin_Sinclaire (danke).Jedoch, ich habe stattdessen beschlossen, zurück zu gehen, zu viel, viel einfacheren Ansatz, kleben mit
attributes_for
und nur der Vergleich das Attribut geändert habe. Speziell:Ich hoffe, dieser Beitrag läßt andere nicht zu wiederholen meine Untersuchungen.
InformationsquelleAutor der Antwort dankohn
Gut, ich habe etwas einfacher, ich bin mit der Verarbeiter, aber ich bin mir ziemlich sicher, dass es das gleiche mit FactoryGirl:
Auch, ich bin mir nicht sicher, warum Sie den Bau einer neuen Fabrik, SETZEN verb soll, fügen Sie neue Material, richtig?. Und was Sie testen, wenn das, was Sie Hinzugefügt haben, in den ersten Platz (
new_attributes
), existiert nach demput
im gleichen Modell.InformationsquelleAutor der Antwort Pablo Olmos de Aguilera C.
Dieser code kann verwendet werden, zu lösen zwei Fragen:
Er löst das problem des Vergleichs von Gleitkommazahlen, die durch die Umwandlung der Werte als string mit JSON.
Außerdem löst es das problem der Prüfung, ob die neuen Werte aktualisiert wurden, aber der rest der Attribute nicht geändert haben.
In meiner Erfahrung, obwohl, wie die Komplexität wächst, die normale Sache zu tun ist zu prüfen, einige spezifische Objekt-Zustand anstelle "erwartet, dass die Attribute, die ich nicht aktualisieren wird sich nicht ändern". Vorstellen, zum Beispiel, haben einige andere Eigenschaften ändern, wie das update erfolgt in der Steuerung, wie "Restposten", "einige status-Attribute"... Sie möchten zu prüfen die spezifischen zu erwartenden Veränderungen, das kann mehr sein, als die aktualisierten Parametern.
InformationsquelleAutor der Antwort chipairon
Hier ist meine Art der Prüfung GESTELLT. Das ist ein Ausschnitt aus meinem
notes_controller_spec
ist der Grundgedanke sollte klar sein (sagen Sie mir, wenn nicht):Statt
FactoryGirl.build(:company).attributes.symbolize_keys
würde ich schreibenFactoryGirl.attributes_for(:company)
. Es ist kürzer und enthält nur die Parameter, die Sie angegeben haben in Ihrer Fabrik.Leider das ist alles was ich sagen kann, über Ihre Fragen.
P. S. Obwohl, wenn Sie legen BigDecimal Gleichheit prüfen auf Datenbank-Ebene durch das schreiben in der Art wie
kann dies für Sie arbeiten.
InformationsquelleAutor der Antwort nsave
Prüfung der rails-Anwendung mit rspec-rails gem.
Erstellt das Gerüst der Benutzer.
Jetzt müssen Sie alle übergeben die Beispiele für die user_controller_spec.rb
Diese schon geschrieben hat, die von der scaffold-generator. Einfach umzusetzen
Nun wird durch viele Beispiele aus dieser Datei.
Für invalid_attributes werden Sie sicher, dass Sie die Validierungen für alle Feld-und
In der Benutzer-Modell .. - Validierung für eine first_name ist da =>
Nun alle Beispiele erzeugt durch die Generatoren wird pass für diese controller_spec
InformationsquelleAutor der Antwort Navnath Shendage