test asciugatrice con associazioni in factory_girl
-
16-09-2019 - |
Domanda
Qualcuno può suggerire un modo migliore di fare uso di una fabbrica di un modello pre-costruito
esempio per la sua associazione? Ad esempio, in modo che fosse possibile
di seguito per definire un figlio della fabbrica messaggio in modo che una chiamata a
Factory(:my_message)
potrebbe sostituire
Factory(:message,:sender=>@me)
?
A volte l'hash di setup è più coinvolto di quanto in questa artificiosa esempio, o è solo ripetuto in tante prove che sembrerebbe meglio per spingere verso il basso nella fabbrica.
Un'alternativa mi viene in mente è quello di definire un metodo di prova helper
come ad esempio create_message_owned_by(@me)
, ma spero ci sia un modo all'interno factory_girl sé.
fabbriche factory_girl:
Factory.define :sender do |s|
sender.name "Dummy name"
end
Factory.define :message do |msg|
msg.text "Dummy text"
msg.association :sender
end
Factory.define :my_message, :parent=>:message do |msg|
msg.text "Dummy text"
### ? what goes here for msg.association :sender ? ###
end
MessagesControllerTest estratto (utilizzando shoulda):
context "on GET /messages" do
setup do
@me = Factory(:sender)
@my_message = Factory(:message,:sender=>@me)
@somebody_elses_message = Factory(:message)
sign_in_as(@me)
get :index
end
should "only assign my messages" do
assert_contains(assigns(:messages), @my_message)
assert_does_not_contain(assigns(:messages), @somebody_elses_message)
end
end
Soluzione
Non so se questo è quello che stai cercando, ma se si crea il primo messaggio è possibile recuperare il mittente attraverso quella e assegnarlo a @me
.
@my_message = Factory(:message)
@me = @my_message.sender
Fa che aiutano a tutti?
Altri suggerimenti
Ignorando per un minuto il problema di creare una dipendenza poco chiara, l'esempio precedente potrebbe essere gestita con i nuovi callback in factorygirl 1.2.3. Ora ci sono after_build
e after_create
callback, in modo da poter eseguire operazioni su oggetti creati dopo che esistono già nel database (e hanno un id per afferrare a, ecc).
Si veda anche questa domanda e questa discussione dalla factory_girl mailing list