2012-09-10 2 views
2

Je viens d'ouvrir Factory_Girl et j'essaie de comprendre comment construire des usines dépendantes, la plupart des questions semblent désuètes en raison de la nouvelle version.Associations dans Factory Girl 4.0.0

J'utilise des associations, mais autres que la création de l'objet associé, cet objet ne semble pas être associé ou lié à l'objet principal de toute façon

est fondamentalement ici ce que j'ai

factory :computer do 
    serial_no "12345" 
end 

factory :allocation do 
    association :computer_id, factory: :computer 
end 

attribution appartient à l'ordinateur et l'ordinateur a_many allocations essentiellement une allocation est un enregistrement de chaque fois qu'un ordinateur est déplacé ou autre. Je ne suis pas sûr de ce que je fais mal, mais chaque fois que j'exécute cela, le ID_ordinateur de l'allocation est '1', mais l'ID de l'ordinateur est quelque chose de aléatoire (généralement un nombre compris entre 0 et 20), et alors mon test échoue parce qu'il ne peut pas trouver l'objet informatique approprié.

Editer: Comme si cela ne déroutait pas assez, le nom de classe actuel est Assignment, j'essayais simplement. Voici le code réel impliqué, le code réel n'a aucun problème car computer_id et user_id sont passés à la méthode create en tant que paramètres lors de la création.

describe "GET index" do 
    it "assigns assignments as @assignment" do 
    Assignment.any_instance.stubs(:valid?).returns(true) 
    assignment = FactoryGirl.create :associated_assignment 
    get :index, {}, valid_session 
    assigns(:assignments).should eq([assignment]) 
    end 
end 

Les usines impliquées sont

factory :user do 
    fname "John" 
    lname "Smith" 
    uname "jsmith" 
    position "placeholder" 
end 

factory :computer do 
    asset_tag "12345" 
    computer_name "comp1" 
    make "dell" 
    model "E6400" 
    serial_no "abc123" 
end 

factory :associated_assignment, class: Assignment do 
    association :user_id, factory: :user 
    association :computer_id, factory: :computer 
    assign_date '11-11-2008' 
end 

Et le contrôleur est:

def index 
    @assignments = [] 
    @computers = Computer.all 
    Computer.all.each do |asset| 
    @assignments << Assignment.where(:computer_id => asset.id).order("assign_date ASC").last 
    end 
    respond_to do |format| 
    format.html # index.html.erb 
    format.json { render json: @assignments } 
    format.xls { send_data @assignments.to_xls } 
end 

Au moment je cours ce test alternatif pour vérifier mes ids:

describe "GET index" do 
    it "assigns assignments as @assignment" do 
    Assignment.any_instance.stubs(:valid?).returns(true) 
    assignment = FactoryGirl.create :associated_assignment 
    get :index, {}, valid_session 
    assigns(:computers).should eq([assignment]) 
    end 
end 

Qui revient donc mething à l'effet de ce qui suit, où l'ID de l'ordinateur est aléatoire mais computer_id d'affectation est toujours 1.

Failure/Error: assigns(:computers).should eq([assignment]) 

    expected: [#<Assignment id: 12, user_id: 1, computer_id: 1, assign_date: "2008-11-11", created_at: "2012-09-10 23:59:48", updated_at: "2012-09-10 23:59:48">] 
     got: [#<Computer id: 14, serial_no: "abc123", asset_tag: 12345, computer_name: "comp1", make: "dell", model: "E6400", created_at: "2012-09-10 23:59:48", updated_at: "2012-09-10 23:59:48">] 

Répondre

2

usines ne garantissent pas ce ids quoi que ce soit aura. Mais vous pouvez trouver l'objet ordinateur approprié via:

allocation = FactoryGirl.create(:allocation) 
computer = allocation.computer 
+1

Merci pour avoir éclairci ce point, mais je suis vraiment confus quant à ce point d'une association est maintenant si tout ce qu'elle produit de une usine qui n'a pas de relation garantie avec l'usine qui l'a appelée. – corodio8

+0

La relation est garantie, mais pas l'id. Vous créez l'allocation avec l'usine et vous obtenez un ordinateur associé gratuitement. –

+0

Qu'est-ce qui détermine exactement l'association? Dans mon cas, j'essaye de lier computer_id sur l'allocation avec l'identification sur l'usine (fonctionne bien dans le code réel), mais le computer_id est complètement indépendant de l'identification de l'ordinateur associé. – corodio8

1

Je pense que le problème est avec: computer_id vs: ordinateur. Voici une façon de le faire qui utilise la capacité de factorygirl à déduire les usines et les associations:

factory :computer do 
    serial_no "12345" 
end 

factory :allocation do 
    computer 
end 

De plus, si vous voulez que chaque ordinateur d'avoir un numéro de série unique dans vos spécifications, utilisez:

sequence :serial_no do |n| 
    "1234#{n}" 
end 

factory :computer do 
    serial_no 
end 

factory :allocation do 
    computer 
end 

usine La fille est consciente de votre modèle et de ses associations, elle peut donc les ramasser et déduire comment créer des objets associés.

Ainsi:

allocation = FactoryGirl.create :allocation 

crée un objet d'allocation et un ordinateur associé à un numéro de série de 12340. L'id de l'objet de l'ordinateur sera déjà dans le domaine computer_id de l'allocation si la relation est complètement mis en place. allocation.computer fonctionnera, et allocation.computer_id sera le même que allocation.computer.id.

Ceci utilise un peu de syntaxe de FactoryGirl. Vous pouvez être des noms plus explicites en fournissant de l'association (champ) et les noms d'usine:

factory :computer do 
    serial_no "12345" 
end 

factory :allocation do 
    association :computer, factory: :computer 
end 
Questions connexes