Quelqu'un peut-il suggérer une meilleure façon de faire une utilisation en usine d'un modèle pré-construit pour son association? Par exemple, afin qu'il soit possible ci-dessous pour définir un enfant de la fabrique de messages afin qu'un appel à Factory(:my_message)
puisse remplacer Factory(:message,:sender=>@me)
?DRYer teste avec des associations dans factory_girl
Parfois, le hachage d'installation est plus impliqué que dans cet exemple artificiel , ou est simplement répété dans de nombreux tests qu'il semblerait 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 comme create_message_owned_by(@me)
, mais j'espère qu'il y a un moyen dans 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
Je n'avais pas pensé à ça, merci. Je peux le voir comme un raccourci pour d'autres situations, mais par exemple. Ici, nous utilisons la gemme Clearance. @me a tendance à s'établir tôt et à être réutilisé sur un tas d'objets, donc le formulaire '@my_message = Factory (: message,: sender => @ me)' serait plus court et plus clair. –
La question est, ce qui rend l'utilisateur actuel différent de tout autre utilisateur? Est-ce juste le fait qu'il est assigné à la variable @me? Cela sort du cadre d'une usine et introduirait une dépendance peu claire. – ryanb
Vous avez raison. À la réflexion, coder en dur @me (ou similaire) dans l'usine est stupide. L'usine a besoin de prendre un paramètre, ce qu'il fait bien sûr très généralement comme le hachage traînant sous la forme de 'Factory (: message,: sender => @ me)'. Ceci semblerait le ramener à l'abstraction d'un assistant comme 'create_message_owned_by (@me)' pour envelopper des configurations d'associations répétitives spécifiques. –