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
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top