1

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 

Répondre

2

Je ne sais pas si c'est ce que vous cherchez, mais si vous créez message peut aller chercher l'expéditeur et l'affecter à @me.

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

Cela aide-t-il du tout?

+0

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. –

+0

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

+1

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. –

1

En ignorant le problème de créer une dépendance peu claire, l'exemple ci-dessus pourrait être traité avec les nouveaux rappels dans FactoryGirl 1.2.3. Il ya maintenant after_build et after_create callbacks, de sorte que vous pouvez effectuer des opérations sur les objets créés après qu'ils existent déjà dans la base de données (et avoir un ID à saisir, etc).

Voir aussi this question et this thread de la liste de diffusion factory_girl.