2011-10-07 6 views
1

Je rencontre des problèmes pour écrire un test dans rspec pour will_paginate. Le problème est que j'ai un modèle avec un propriétaire qui peut avoir beaucoup d'animaux. Cela conduit à un fichier factories.rb qui ressemble à ceci:Test RSpec avec factory_girl et will_paginate pour les objets associés

Factory.define :owner do |owner| 
    owner.personid    "1111111" 
    owner.firstname    "Nisse" 
    owner.lastname    "Gunnarsson" 
    owner.street    "Street" 
    owner.postaladress   "38830" 
    owner.town     "Town" 
    owner.phone     "555-5555" 
    owner.mobile    "555-5556" 
    owner.email     "[email protected]" 
    owner.reminder    true 
end 

Factory.define :pet do |pet| 
    pet.name     "Hedvig" 
    pet.specie     "Rabbot" 
    pet.breed     "Lowen/vadur" 
    pet.colour     "Madagaskar" 
    pet.association    :owner 
end 

Dans mon test j'ai

describe "Get show" do 
    before(:each) do 
    @owner = Factory(:owner) 
    30.times do 
    #@owner.pets << Factory.build(:pet) 
    @pet = Factory.build(:pet, :owner => @owner) 
    #@owner.pets << @pet 
    end  
end 

it "should have an element for each pet" do 
    get :show, :id => @owner 
    @owner.pets[0..2].each do |pet| 
    response.should have_selector("td", :content => pet.name) 
    end 
    response.should have_selector("td", :content => "Hedvig") 
end 

it "should paginate pets" do 
    get :show, :id => @owner 
    response.should have_selector("div.pagination") 
    response.should have_selector("span.disabled", :content => "Previous") 
    response.should have_selector("a", :href => "/pets?page=2", 
             :content => "2") 
    response.should have_selector("a", :href => "/pets?page=2", 
             :content => "Next") 
end 

end

Je crée donc un propriétaire à l'usine, il n'y a pas de problème. Je peux obtenir le nom des propriétaires par puts @owner.firstname

Je peux également créer un animal de compagnie, qui a le bon propriétaire (@pet.owner.firstname), mais je ne peux pas comprendre comment remplir le tableau des propriétaires (@ owner.pets) avec des animaux de compagnie.

Si je fais un @ owner.pets.count est 0.

Les applications fonctionne très bien, je ne peux pas comprendre comment écrire le test. Je suis vraiment nouveau sur les rails et TDD mais je veux le faire correctement. Dites-moi si je devrais ajouter plus d'informations.

Vive Carl

Répondre

1

Eh bien d'abord, faire @pet = Factory.build(:pet, :owner => @owner) builds seulement un objet Pet, mais enregistre jamais à la DB. Vous voudrez utiliser Factory.create(:pet, ... pour l'enregistrer.

Le tableau @owner.pets est [] lorsque vous créez initialement l'objet Propriétaire. Si vous créez simplement des enregistrements dans la base de données avec Factory.create alors oui, techniquement @owner a des animaux domestiques, mais l'objet @owner ne les connaît pas car il est déjà en mémoire avec un tableau .pets de [].

Au lieu de cela, essayez ceci:

@owner.pets << Factory.create(:pet, :owner => @owner) 

Ce ne sera pas seulement l'enregistrer dans la base de données, permettant ainsi de nouveaux appels à la base de données valide (comme maintenant, si vous avez fait Pet.count vous regagnerons 1) mais aussi le tableau @owner.pets en mémoire aura un objet Pet valide à l'intérieur.

+0

Brillant! Cela l'a résolu. Je suppose que j'ai encore beaucoup à apprendre. (ce qui est assez amusant). Merci un million! – abegbg