使用factory_girl进行RSpec测试,并使用will_paginate进行关联对象

我在rspec中为will_paginate编写测试时遇到问题。 问题是我有一个拥有许多宠物的主人的模型。 这导致一个看起来像这样的factories.rb文件:

 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 "nisse@test.com" 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 < @owner) #@owner.pets < @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 

结束

所以我在工厂创建了一个所有者,没问题。 我可以通过puts @owner.firstname获取所有者的名字

我也可以创建一个拥有正确所有者的宠物( @pet.owner.firstname ),但我无法弄清楚如何用宠物填充所有者数组(@ owner.pets)。

如果我执行@ owner.pets.count则为0。

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

如果我应该添加更多信息,请告诉我。

干杯卡尔

首先,做@pet = Factory.build(:pet, :owner => @owner)只构建一个Pet对象,但从不将它保存到DB。 您可能希望使用Factory.create(:pet, ...来实际保存它。

最初创建Owner对象时, @owner.pets数组为[]。 如果你只是在带有Factory.create的数据库中创建记录,那么是的,技术上@owner有宠物,但@owner对象不知道它们,因为它已经在内存中有.pets数组[]。

相反,试试这个:

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

这不仅会将其保存到数据库中,因此对数据库的任何新调用都是有效的(例如现在如果你执行Pet.count就会返回1),而且内存中的@owner.pets数组也会有效其中的宠物对象。