Question

Quelqu'un peut-il suggérer une meilleure façon d'utiliser une usine un modèle pré-construit par exemple pour son association? Par exemple, de sorte qu'il serait possible ci-dessous pour définir un enfant de l'usine de message de sorte qu'un appel à Factory(:my_message) pourrait remplacer Factory(:message,:sender=>@me)?

Parfois, le hachage de configuration est plus impliqué que dans cette artificiel par exemple, ou est simplement répété dans de nombreux tests, il semble préférable de le pousser vers le bas dans l'usine.

Une alternative que je peux penser est de définir une méthode d'assistance de test tels que create_message_owned_by(@me), mais j'espère qu'il ya un moyen au sein factory_girl lui-même.

usines 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

extrait MessagesControllerTest (en utilisant 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
Était-ce utile?

La solution

Je ne sais pas si c'est ce que vous cherchez, mais si vous créez un message, vous pouvez chercher l'expéditeur par là et l'attribuer à @me.

@my_message = Factory(:message)
@me = @my_message.sender

Est-ce que l'aide du tout?

Autres conseils

Ignorer pendant une minute le problème de la création d'une dépendance peu claire, l'exemple ci-dessus pourrait être manipulé avec les nouveaux callbacks dans factorygirl 1.2.3. Il y a maintenant callbacks after_build et after_create, afin que vous puissiez effectuer des opérations sur les objets créés après existent déjà dans la base de données (et ont une carte d'identité pour saisir sur, etc).

Voir aussi cette question et ce fil de la liste de diffusion de factory_girl

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top