Ich habe Land Fabrik, die für die so etwas wie diesesDer beste Weg, die Eindeutigkeit eines 2-stelligen Feldes innerhalb einer Fabrik zu erzwingen?
FactoryGirl.define do
factory :country do
name { "Country_Name_#{rand(10000).to_s}#{('a'..'z').to_a.shuffle.join.first(10)}" }
alpha { ('a'..'z').to_a.shuffle.join.first(2) }
end
end
alpha ist ein 2 Ländercode, sieht ich Einzigartigkeit bestätigen.
validates :alpha,
presence: true,
uniqueness:true,
length: {is: 2}
Wenn große Tests laufen, laufe ich oft in
ActiveRecord::RecordInvalid:
Validation failed: Alpha has already been taken
Insbesondere bei Aufzeichnungen Kind zu schaffen
factory :state do
name { "State_Name_#{rand(10000).to_s}#{('a'..'z').to_a.shuffle.join.first(10)}" }
country
end
Gibt es einen besseren Weg, um mein Land Fabrik zu bauen um Duplikate zu vermeiden? Oder gibt es einen besseren Weg, um den Zustand Fabrik zu bauen, so dass das belongs_to Land eine Mischung aus neuen und vorhandenen Datensätze
Die Lösung
Für alle anderen hier mit einem ähnlichen Problem kommen, Sequenzen sind definitiv der Weg zu geh (danke born4new und Slicedpan).
Bei der Umsetzung erkannte ich, dass ich einige andere Probleme hatte, die Probleme verursachten.
Zunächst wurde der Datenbank-Cleaner nicht ordnungsgemäß ausgeführt, sodass die Datenbank zwischen den Tests nicht auf einen sauberen Status zurückgesetzt wurde. Daher stieß ich ziemlich schnell auf Duplikate.
Ich fand auch, dass ich FactoryGirl Sequenzen nach jedem Test zurücksetzen musste. Ansonsten sah ich für lange Sequenzen zx, zy, zz, a, b
, und die einzelnen Zeichen fehlten meine Validierungen.
#spec/rails_helper.rb
config.append_after(:each) do
DatabaseCleaner.clean
FactoryGirl.reload
end
danke @slicedpan, das ist eine gute Idee. Ich hatte mir Sequenzen angesehen, aber meine Implementierung war nicht so vollständig wie deine. Weißt du wie/wann während eines Tests Factorygirl die Sequenz neu startet? Ist es für die gesamte Dauer der Testsuite oder für eine bestimmte Spezifikation oder ..? Ich schien immer noch in Duplikate zu laufen –
Sollte für die gesamte Suite soweit ich weiß – Slicedpan