tests SECHE associations factory_girl
-
16-09-2019 - |
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
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