Тест RSpec с factory_girl и will_paginate для связанных объектов - PullRequest
1 голос
/ 08 октября 2011

У меня проблемы с написанием теста в rspec для will_paginate.Проблема в том, что у меня есть модель с владельцем, которая может иметь много домашних животных.Это приводит к файлу factories.rb, который выглядит следующим образом:

</p> <pre><code>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

В моем тесте у меня есть

</p> <pre><code>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.домашние животные) с домашними животными.

Если я делаю @ owner.pets.count, то это 0.

Приложения работают нормально, я просто не могу понять, как написать тест.Я действительно плохо знаком с рельсами и TDD, но я хочу сделать это правильно.

Дайте мне знать, если я должен добавить дополнительную информацию.

Cheers Carl

1 Ответ

1 голос
/ 08 октября 2011

Ну во-первых, выполнение @pet = Factory.build(:pet, :owner => @owner) только создает объект Pet, но никогда не сохраняет его в БД. Вы бы хотели использовать Factory.create(:pet, ..., чтобы сохранить его.

Массив @owner.pets равен [] при первоначальном создании объекта Owner. Если вы просто создаете записи в БД с Factory.create, тогда да, технически @owner имеет домашних животных, но объект @owner не знает о них, потому что он уже находится в памяти с массивом .pets [].

Вместо этого попробуйте это:

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

Это не только сохранит его в базе данных, что сделает любые новые вызовы базы данных действительными (например, теперь, если вы сделали Pet.count, вы вернетесь назад 1), но и массив @owner.pets в памяти будет иметь действительный объект Pet внутри него.

...