tutorial rails factorybot factory_girl_rails example create bot ruby-on-rails ruby-on-rails-3 factory-bot

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 en association :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



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) }