2009-11-04 11 views
5

Io di solito uso questo passaggio per impostare i record con factory_girl:Qual è la procedura migliore per creare associazioni con factory_girl nel cetriolo?

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

Ed ecco il mio lavoro-in giro quando la creazione di associazioni:

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

So che questo è un male. L'uso degli id ​​rende l'intera cosa fragile e criptica dal punto di vista della persona del dominio.

Quindi, la mia domanda è: quale sarebbe la migliore pratica per creare un'associazione con factory_girl e un argomento di tabella come quello sopra?

risposta

0

Giusto per rispondere alla mia domanda: Pickle

3

È possibile definire più associazioni in una fabbrica.
come la seguente:

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 

Facendo un Factory(:group) sarà creare l'uplet gruppo con due elementi in esso.

+1

Il trucco qui è che group.items dovrebbe restituire un array. Mi ci è voluto un po 'per risolverlo. – jonnii

+0

Sì, questo non è facile da capire (ma vedere come funziona, è logico) –

+0

Hai capito. Ma c'è un modo per avvolgere un passaggio di cetriolo con un parametro di tabella (come quello nel mio post) in una fabbrica simile? Forse, dovrei solo prendere un approccio pragmatico ed essere dettagliato e specifico nel passo ("Dato che ho due elementi, foo e bar, che appartengono a un gruppo chiamato foo") invece di armeggiare con le tabelle, ma suona un po ' come un anti-modello per me? –

0

Offriamo le factorygirl passi cetriolo definiti:
https://github.com/thoughtbot/factory_girl/blob/master/lib/factory_girl/step_definitions.rb

È possibile impostare i tuoi articoli e il vostro gruppo (s) in fase solo un cetriolo:

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

In questo modo, la creazione del gruppo "Bar" utilizza la funzionalità "find_or_create_by", quindi la prima chiamata crea il gruppo, il successivo 2 chiamate trova il gruppo già creato.

In questo modo tutti e 3 gli articoli avranno lo stesso gruppo "Bar" e sarà possibile creare il numero di elementi raggruppati di cui si ha bisogno.

+0

I passi di FactoryGirl Cucumber vengono deprecati da ThoughtBot in favore della scrittura di scenari migliori. Vedi il loro post sul blog: http://robots.thoughtbot.com/post/25650434584/writing-better-cucumber-scenarios-or-why-were – MikeH

Problemi correlati