Alguém pode me dizer se estou apenas fazendo a configuração da maneira errada?
Tenho os seguintes modelos com associações 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
Estou usando Rails 3.1.rc4, FactoryGirl 2.0.2, factory_girl_rails 1.1.0 e rspec. Aqui está minha verificação básica de integridade rspec rspec para a :listing
fábrica:
it "creates a valid listing from factory" do
Factory(:listing).should be_valid
end
Aqui está a fábrica (: listagem)
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
As fábricas :listing_feature
e :feature
são configuradas de forma semelhante.
Se a association :features
linha estiver comentada, todos os meus testes serão aprovados.
Quando é
association :features, :factory => :feature
a mensagem de erro é a
undefined method 'each' for #<Feature>
que achei que fazia sentido para mim, porque listing.features
retorna um array. Então eu mudei para
association :features, [:factory => :feature]
e o erro que recebo agora é ArgumentError: Not registered: features
Não é sensato gerar objetos de fábrica dessa maneira ou o que estou perdendo? Muito obrigado por toda e qualquer contribuição!
Como alternativa, você pode usar um bloco e pular a
association
palavra - chave. Isso torna possível construir objetos sem salvar no banco de dados (caso contrário, uma associação has_many salvará seus registros no banco de dados, mesmo se você usar abuild
função em vez decreate
).fonte
build
ecreate
torna o padrão mais versátil. Em seguida, use esta estratégia de construção FG personalizada gist.github.com/Bartuz/74ee5834a36803d712b7 parapost nested_attributes_for
testar as ações do controlador queaccepts_nested_attributes_for
association
palavra - chave usa a mesma estratégia de construção para pai e filho. Assim, ele pode construir objetos sem salvar no banco de dados.Você pode usar
trait
:Com
callback
, se você precisar de criação de banco de dados:Use em suas especificações como esta:
Isso removerá a duplicação em suas fábricas e será mais reutilizável.
https://robots.thoughtbot.com/remove-duplication-with-factorygirls-traits
fonte
Eu tentei algumas abordagens diferentes e esta é a que funcionou de forma mais confiável para mim (adaptada ao seu caso)
fonte
Aqui está como eu configurei o meu:
E então, em seus testes, você pode fazer:
Espero que ajude.
fonte