2009-11-04 16 views
5

normalmente utilizo este paso para configurar los registros con factory_girl:¿Cuál es la mejor práctica para establecer asociaciones con factory_girl en pepino?

Given /^the following (.+) records?:$/ do |factory, table| 
    table.hashes.each do |hash| 
    Factory(factory, hash) 
    end 
end 

Y aquí está mi trabajo en torno a la hora de establecer asociaciones:

Given the following group record: 
    | id | name | 
    | 1 | foo | 
And the following item records: 
    | name | group_id | 
    | bar | 1  | 
    | baz | 1  | 
    # ... 

Sé que esto es malo. El uso de identificadores hace que todo sea frágil y críptico desde la perspectiva de la persona de dominio.

Entonces, mi pregunta es: ¿cuál sería la mejor práctica para configurar una asociación con factory_girl y un argumento de tabla como el de arriba?

Respuesta

0

Sólo para responder a mi propia pregunta: Pickle

3

Puede definir múltiples asociaciones en una fábrica.
como la siguiente:

Factory.define :item do |item| 
    item.name   "item_name" 
end 

Factory.define :group do |group| 
    group.name   "group_name" 
    group.items   { |items| [ items.association(:item), items.association(:item) ] } 
end 

Haciendo un Factory(:group) va a crear su uplet grupo con dos elementos en ella.

+1

El truco aquí es que group.items debería devolver una matriz. Me tomó un tiempo resolver eso. – jonnii

+0

Sí, eso no es fácil de entender (pero viendo cómo funciona, es lógico) –

+0

Te tengo. Pero, ¿hay alguna forma de ajustar un paso de pepino con un parámetro de tabla (como el de mi publicación) alrededor de una fábrica de este tipo? Tal vez, debería adoptar un enfoque pragmático y ser detallado y específico en el paso ("Dado que tengo dos elementos, foo y bar, que pertenecen a un grupo llamado foo") en lugar de ocuparme de las tablas, pero eso suena un tanto como un antipatrón para mí? –

0

Usted puede utilizar los pasos de pepino factorygirl definidos:
https://github.com/thoughtbot/factory_girl/blob/master/lib/factory_girl/step_definitions.rb

Puede configurar sus artículos y su grupo (s) en el paso sólo un pepino:

Given the following items exists: 
    | Name  | Group  | 
    | Foo  | Name: Bar | 
    | Foam  | Name: Bar | 
    | Food  | Name: Bar | 

Al hacerlo así, la creación del grupo 'Bar' utiliza la funcionalidad 'find_or_create_by', por lo que la primera llamada crea el grupo, el siguiente 2 llamadas encuentra el grupo ya creado.

De esta forma, los 3 elementos tendrán el mismo grupo 'Barra', y puede crear tantos elementos agrupados como necesite.

+0

ThoughtBot está desaprobando los pasos de FactoryGirl Cucumber a favor de escribir mejores escenarios. Ver su publicación en el blog: http://robots.thoughtbot.com/post/25650434584/writing-better-cucumber-scenarios-or-why-were – MikeH

Cuestiones relacionadas