Quelqu'un peut-il me dire si je ne fais que la configuration dans le mauvais sens?
J'ai les modèles suivants qui ont des associations has_many.through:
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
J'utilise Rails 3.1.rc4, FactoryGirl 2.0.2, factory_girl_rails 1.1.0 et rspec. Voici mon contrôle de base rspec rspec sanity pour l' :listing
usine:
it "creates a valid listing from factory" do
Factory(:listing).should be_valid
end
Voici l'usine (: listing)
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
Les usines :listing_feature
et :feature
sont configurées de la même manière.
Si la association :features
ligne est commentée, tous mes tests réussissent.
Lorsqu'il est
association :features, :factory => :feature
le message d'erreur est
undefined method 'each' for #<Feature>
que je pensais avoir du sens pour moi car car listing.features
renvoie un tableau. Alors je l'ai changé en
association :features, [:factory => :feature]
et l'erreur que j'obtiens maintenant est ArgumentError: Not registered: features
N'est-il simplement pas judicieux de générer des objets d'usine de cette façon, ou que me manque-t-il? Merci beaucoup pour toute contribution!
Vous pouvez également utiliser un bloc et ignorer le
association
mot - clé. Cela permet de créer des objets sans enregistrer dans la base de données (sinon, une association has_many enregistrera vos enregistrements dans la base de données, même si vous utilisez labuild
fonction à la place decreate
).la source
build
et encreate
fait le modèle le plus polyvalent. Ensuite, utilisez cette stratégie de construction FG personnalisée gist.github.com/Bartuz/74ee5834a36803d712b7 pourpost nested_attributes_for
tester les actions du contrôleur quiaccepts_nested_attributes_for
association
mot clé utilise la même stratégie de génération pour le parent et l'enfant. Ainsi, il peut créer des objets sans enregistrement dans la base de données.Vous pouvez utiliser
trait
:Avec
callback
, si vous avez besoin de la création de DB:Utilisez dans vos spécifications comme ceci:
Cela supprimera la duplication dans vos usines et sera plus réutilisable.
https://robots.thoughtbot.com/remove-duplication-with-factorygirls-traits
la source
J'ai essayé quelques approches différentes et c'est celle qui a fonctionné le plus fiable pour moi (adaptée à votre cas)
la source
Voici comment j'ai configuré le mien:
Et puis dans vos tests, vous pouvez faire:
J'espère que cela pourra aider.
la source