ruby-on-rails - rails - factorybot create
FactoryGirl: attributes_for no me da atributos asociados (7)
Éste no devuelve marcas de tiempo, etc., solo atributos que son accesibles para la asignación masiva:
(FactoryGirl.build :position).attributes.symbolize_keys.reject { |key, value| !Position.attr_accessible[:default].collect { |attribute| attribute.to_sym }.include?(key) }
Aún así, es bastante feo. Creo que FactoryGirl debería proporcionar algo como esto de la caja.
Abrí una solicitud para esto here .
Tengo una fábrica de modelos de código como esta:
Factory.define :code do |f|
f.value "code"
f.association :code_type
f.association(:codeable, :factory => :portfolio)
end
Pero cuando pruebo mi controlador con un simple test_should_create_code como este:
test "should create code" do
assert_difference(''Code.count'') do
post :create, :code => Factory.attributes_for(:code)
end
assert_redirected_to code_path(assigns(:code))
end
... la prueba falla. El nuevo registro no se crea.
En la consola, parece que attributes_for
no devuelve todos los atributos requeridos como create hace.
rob@compy:~/dev/my_rails_app$ rails console test
Loading test environment (Rails 3.0.3)
irb(main):001:0> Factory.create(:code)
=> #<Code id: 1, code_type_id: 1, value: "code", codeable_id: 1, codeable_type: "Portfolio", created_at: "2011-02-24 10:42:20", updated_at: "2011-02-24 10:42:20">
irb(main):002:0> Factory.attributes_for(:code)
=> {:value=>"code"}
¿Algunas ideas?
Gracias,
Aquí hay otra manera. Probablemente quiera omitir los atributos id
, created_at
y updated_at
.
FactoryGirl.build(:car).attributes.except(''id'', ''created_at'', ''updated_at'').symbolize_keys
Limitaciones
- No genera atributos para HMT y asociaciones HABTM (ya que estas asociaciones se almacenan en una tabla de unión, no en un atributo real).
- La estrategia de asociación en la fábrica debe
create
, como enassociation :user, strategy: :create
. Esta estrategia puede hacer que su fábrica sea muy lenta si no la usa con prudencia.
En mi APP / spec / controllers / pages_controllers_spec.rb configuré:
let(:valid_attributes) { FactoryGirl.attributes_for(:page).merge(subject: FactoryGirl.create(:theme), user: FactoryGirl.create(:user)) }
Porque tengo dos modelos asociados. Esto también funciona:
FactoryGirl.define do factory :page do title { Faker::Lorem.characters 12 } body { Faker::Lorem.characters 38 } discution false published true tags "linux, education, elearning" section { FactoryGirl.create(:section) } user { FactoryGirl.create(:user) } end end
He sintetizado lo que otros han dicho, en caso de que ayude a alguien más. Para ser coherente con la versión de FactoryGirl en cuestión, he utilizado Factory.build () en lugar de FactoryGirl.build (). Actualizar según sea necesario.
def build_attributes_for(*args)
build_object = Factory.build(*args)
build_object.attributes.slice(*build_object.class.accessible_attributes).symbolize_keys
end
Simplemente llame a este método en lugar de Factory.attributes_for:
post :create, :code => build_attributes_for(:code)
La esencia completa (dentro de un módulo de ayuda) está aquí: https://gist.github.com/jlberglund/5207078
Puedes probar algo como esto:
(Factory.build :code).attributes.symbolize_keys
Mira esto: http://groups.google.com/group/factory_girl/browse_thread/thread/a95071d66d97987e )
Sugeriría otro enfoque, que creo que es más claro:
attr = attributes_for(:code).merge(code_type: create(:code_type))
heres lo que termino haciendo ...
conf = FactoryGirl.build(:conference)
post :create, {:conference => conf.attributes.slice(*conf.class.accessible_attributes) }