2011-10-07 69 views
1

我在使用rspec为will_paginate编写测试时遇到了问题。问题是我有一个拥有许多宠物的所有者的模型。这导致factories.rb文件看起来像这样:对于关联对象的factory_girl和will_paginate的RSpec测试

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 

在我的测试我有

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

所以我创建所有者与工厂,没有问题存在。我能得到业主的puts @owner.firstname

的名字,我也可以创建一个宠物,具有正确的所有者(@pet.owner.firstname),但我无法弄清楚如何填补业主阵列(@ owner.pets)宠物。

如果我做了@ owner.pets.count为0。

的应用程序工作正常,我只是无法弄清楚如何编写测试。我对轨道和TDD都非常陌生,但我想做的对。

让我知道我是否应该添加更多信息。

干杯卡尔

回答

1

那么首先,做@pet = Factory.build(:pet, :owner => @owner)只有建立一个宠物的对象,但永远不会保存到数据库中。你会想用Factory.create(:pet, ...来实际保存。当您最初创建所有者对象时,@owner.pets数组为[]。如果你简单地在数据库中创建记录Factory.create然后是的,在技术上@owner有宠物,但@owner对象不知道他们,因为它已经在内存中与.pets阵列的[]。

相反,试试这个:

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

,不仅将它保存到数据库中,从而使任何新的呼叫到数据库中有效(比如现在,如果你没有Pet.count那你将获得1)但内存中的@owner.pets数组中也会有一个有效的Pet对象。

+0

太棒了!这解决了它。我想我还有很多东西需要学习。 (这很有趣)。太感谢了! – abegbg