49

Sto usando Factory Girl per creare due istanze nel mio modello/test di unità per un gruppo. Sto testando il modello di verificare che una chiamata a .Current restituisce solo i gruppi di 'corrente' in base all'attributo di scadenza di cui al seguito ...Crea una ragazza di fabbrica che ignora la convalida del mio modello

describe ".current" do 
    let!(:current_group) { FactoryGirl.create(:group, :expiry => Time.now + 1.week) } 
    let!(:expired_group) { FactoryGirl.create(:group, :expiry => Time.now - 3.days) } 

    specify { Group.current.should == [current_group] } 
    end 

mio problema è che ho la validazione del modello che controlla la scadenza di un nuovo gruppo è successiva alla data odierna. Ciò solleva il fallimento della validazione di seguito.

1) Group.current 
    Failure/Error: let!(:expired_group) { FactoryGirl.create(:group, :expiry => Time.now - 3.days) } 
    ActiveRecord::RecordInvalid: 
     Validation failed: Expiry is before todays date 

C'è un modo per creare forzatamente il Gruppo o aggirare la convalida quando si crea utilizzando Factory Girl?

risposta

62

Questo non è molto specifico per factorygirl, ma si può sempre ignorare le convalide durante il salvataggio di modelli tramite save(:validate => false):

describe ".current" do 
    let!(:current_group) { FactoryGirl.create(:group) } 
    let!(:old_group) { 
    g = FactoryGirl.build(:group, :expiry => Time.now - 3.days) 
    g.save(:validate => false) 
    g 
    } 

    specify { Group.current.should == [current_group] } 
end 
+0

Questo è esattamente quello che stavo cercando, grazie! – Norto23

+0

Vedere la risposta di Jason Denney sotto per una soluzione migliore. –

5

Per questo specifico caso la convalida della data-baesd, si potrebbe anche utilizzare il timecop gemma temporaneamente modificare il tempo per simulare il vecchio record creato in passato.

1

A seconda del proprio scenario, è possibile modificare la convalida solo in caso di aggiornamento. Esempio: :validates :expire_date, :presence => true, :on => [:update ]

46

Preferisco questa soluzione da https://github.com/thoughtbot/factory_girl/issues/578.

All'interno della fabbrica:

to_create {|instance| instance.save(validate: false) } 
+4

Questa è una soluzione molto più elegante di quella accettata. –

+3

Ricorda che se lo facessi per la tua fabbrica per usi generici, salteresti le convalide OGNI volta che hai creato su quella fabbrica. Probabilmente è meglio usare questa tecnica solo su una sub-fabbrica (o su una caratteristica). – tgf

+0

Quasi certamente vorrai metterlo in un tratto. Vedere la risposta di Tim Scott, sotto. –

3
foo = build(:foo).tap{ |u| u.save(validate: false) } 
6

E 'una cattiva idea di saltare le convalide per impostazione predefinita in fabbrica. Alcuni capelli saranno tirati fuori trovandolo.

Il modo più bello, penso:

trait :skip_validate do 
    to_create {|instance| instance.save(validate: false)} 
end 

Poi, nel tuo test:

create(:group, :skip_validate, expiry: Time.now + 1.week) 
+0

questo è il modo migliore per risolvere questo problema! –

Problemi correlati