使用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
数组也会有效其中的宠物对象。