Rspec, shoulda, validate_uniqueness_of mit Umfang und falsche Fehlermeldung
Habe ich folgende Rspec testen:
describe Productlimit do
before(:each) do
@productlimit = Factory.create(:productlimit, :user => Factory.create(:user))
end
subject { @productlimit }
...
it { should validate_uniqueness_of(:price_cents).scoped_to(:direction_down, :currency, :market_id, :user_id) }
...
end
Aber ich bekomme folgende verwirrende Fehlermeldung:
1) Productlimit
Failure/Error: it { should validate_uniqueness_of(:price_cents).scoped_to(:direction_down, :currency, :market_id, :user_id) }
Expected errors to include "has already been taken" when price_cents is set to 9530, got errors: ["direction_down has already been taken (false)"]
Können Sie mir helfen? Ich verstehe nicht, warum dies nicht funktioniert, weil die Fehlermeldung korrekt zu sein scheint?
EDIT:
Dies passiert auch in anderen Situationen:
# product_spec.rb
...
it { should validate_numericality_of(:price).with_message("price_cents must be greater than 0 (0)") }
# rake spec:models
Failure/Error: it { should validate_numericality_of(:price).with_message("price_cents must be greater than 0 (0)") }
Expected errors to include "price_cents must be greater than 0 (0)" when price is set to "abcd", got errors: ["price_cents must be greater than 0 (0)"]
welche Versionen des shoulda/rspec verwenden Sie?
Ich shoulda-Matcher (1.0.0.beta2), aber ich habe es versucht mit dem aktuellen "shoulda' gem als gut..
es scheint mir, dass Sie etwas testen, dass die Schienen sollten schon testen. wenn Sie validate_numericality der in Ihrem Modell, warum es auch aufrufen, in Ihren tests? das ist unnötige Doppelarbeit
wenn die Validierung ist Teil der Spezifikation, des Verhaltens, er sollte sein es zu testen.
Nicht die Fabrik.create-Aufruf erfolgreich sein, indem Sie selbst? Sie könnten versuchen, isolieren Sie diese testen, indem Sie es auf eine Productlist.neue(:price_cents => ...) - Objekt.
Ich shoulda-Matcher (1.0.0.beta2), aber ich habe es versucht mit dem aktuellen "shoulda' gem als gut..
es scheint mir, dass Sie etwas testen, dass die Schienen sollten schon testen. wenn Sie validate_numericality der in Ihrem Modell, warum es auch aufrufen, in Ihren tests? das ist unnötige Doppelarbeit
wenn die Validierung ist Teil der Spezifikation, des Verhaltens, er sollte sein es zu testen.
Nicht die Fabrik.create-Aufruf erfolgreich sein, indem Sie selbst? Sie könnten versuchen, isolieren Sie diese testen, indem Sie es auf eine Productlist.neue(:price_cents => ...) - Objekt.
InformationsquelleAutor Lichtamberg | 2011-07-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Überprüfen validate_uniqueness_of(:Feld), aber für diese sollte man zumindest ein Datensatz in der Datenbank zu überprüfen uniquness beschränken.
Hier ist....
Zu überprüfen Einzigartigkeit
Klappt es ausprobieren.
InformationsquelleAutor Rameshwar Vyevhare
Hinzufügen, was Riche gesagt hat, über die Einzigartigkeit, die Validierung auf :direction_down, würde ich vermuten, dass die Art und Weise Ihrer ProductLimit factory erzeugt Werte für :direction_down. Es ist vielleicht nicht immer das generieren eindeutiger Werte für alle Attribute, die die Einzigartigkeit der Validierung auf.
Auch, eine Frage, die ich konfrontiert mit der Einzigartigkeit der Validierung ist das erste Objekt ( das Subjekt in deinem Fall) ist, wird erstellt, bevor die überprüfung sollten keine widersprüchlichen Werte mit denen der Fabrik "zufällig" generiert. Um zu veranschaulichen, mit einem trivialen Beispiel
hat das Potenzial, zu scheitern falsch, falls das Objekt konstruiert, indem die shoulda matcher endet mit direction_down set "abc", wenn es eine Einzigartigkeit, die Validierung auf :direction_down.
InformationsquelleAutor jake
Haben Sie die database_cleaner Einstellungen in der sepc_helper?
wenn nicht, dann hinzufügen
in spec_helper.rb
fügen Sie den folgenden in der RSpec.konfigurieren block
Außerdem können Sie nach dem Fabrik-code? nur ein klareres Bild.
Ich hoffe, das hilft.
Prüfen Sie auch, ob es irgendeine Einzigartigkeit, die Validierung auf :direction_down Attribut.
InformationsquelleAutor hindenbug
Versuchen, Sie zu entfernen
test/fixtures/*
und versuchen, manuell Objekt erstellen, bevor die Tests Einzigartigkeit (keine Factory). Auch haben Sie versucht:InformationsquelleAutor Łukasz Anwajler
Den Fehler nicht korrekt für den matcher, weil es Klagen über die Einzigartigkeit :direction_down, wenn Sie gebeten es zu testen, dass die Einzigartigkeit :price_cents gültig war.
Nicht den code für Ihr Modell gehören ein
validates_uniqueness_of :direction_down
? Wenn ja, würde erklären, die Botschaft.InformationsquelleAutor Ritchie
Ersten Fall (mit
validate_uniquess_of
) passiert mir nach einem unerwarteten Absturz. Eine einfacherake db:test:prepare
es behoben.InformationsquelleAutor Nicolas Buduroi