Kann mir jemand sagen, ob ich das Setup nur falsch mache?
Ich habe die folgenden Modelle, die has_many.through Assoziationen haben:
class Listing < ActiveRecord::Base
attr_accessible ...
has_many :listing_features
has_many :features, :through => :listing_features
validates_presence_of ...
...
end
class Feature < ActiveRecord::Base
attr_accessible ...
validates_presence_of ...
validates_uniqueness_of ...
has_many :listing_features
has_many :listings, :through => :listing_features
end
class ListingFeature < ActiveRecord::Base
attr_accessible :feature_id, :listing_id
belongs_to :feature
belongs_to :listing
end
Ich verwende Rails 3.1.rc4, FactoryGirl 2.0.2, factory_girl_rails 1.1.0 und rspec. Hier ist meine grundlegende Überprüfung der Rspec Rspec-Gesundheit für die :listing
Fabrik:
it "creates a valid listing from factory" do
Factory(:listing).should be_valid
end
Hier ist Fabrik (: Auflistung)
FactoryGirl.define do
factory :listing do
headline 'headline'
home_desc 'this is the home description'
association :user, :factory => :user
association :layout, :factory => :layout
association :features, :factory => :feature
end
end
Die :listing_feature
und :feature
Fabriken sind ähnlich eingerichtet.
Wenn die association :features
Zeile auskommentiert ist, bestehen alle meine Tests.
Wann ist es
association :features, :factory => :feature
Die Fehlermeldung ist
undefined method 'each' for #<Feature>
meiner Meinung nach sinnvoll, weil weil listing.features
ein Array zurückgegeben wird. Also habe ich es geändert in
association :features, [:factory => :feature]
und der Fehler, den ich jetzt bekomme, ist: ArgumentError: Not registered: features
Ist es einfach nicht sinnvoll, Fabrikobjekte auf diese Weise zu generieren, oder was fehlt mir? Vielen Dank für jede Eingabe!
Alternativ können Sie einen Block verwenden und das
association
Schlüsselwort überspringen . Auf diese Weise können Objekte erstellt werden, ohne in der Datenbank gespeichert zu werden (andernfalls speichert eine has_many-Zuordnung Ihre Datensätze in der Datenbank, auch wenn Sie diebuild
Funktion anstelle von verwendencreate
).quelle
build
undcreate
macht es zum vielseitigsten Muster. Verwenden Sie dann diese benutzerdefinierte FG-Build-Strategie gist.github.com/Bartuz/74ee5834a36803d712b7 ,post nested_attributes_for
um Controller-Aktionen zu testen, dieaccepts_nested_attributes_for
association
Schlüsselwort dieselbe Erstellungsstrategie für Eltern und Kinder. So können Objekte erstellt werden, ohne in der Datenbank gespeichert zu werden.Sie könnten verwenden
trait
:Mit
callback
, wenn Sie eine DB-Erstellung benötigen:Verwenden Sie in Ihren Spezifikationen wie folgt:
Dadurch werden Doppelspurigkeiten in Ihren Fabriken beseitigt und können wiederverwendet werden.
https://robots.thoughtbot.com/remove-duplication-with-factorygirls-traits
quelle
Ich habe ein paar verschiedene Ansätze ausprobiert und dieser hat für mich am zuverlässigsten funktioniert (angepasst an Ihren Fall).
quelle
So habe ich meine eingerichtet:
Und dann können Sie in Ihren Tests Folgendes tun:
Hoffentlich hilft das.
quelle