Тест RSpec с factory_girl и will_paginate для связанных объектов

У меня проблемы с написанием теста в rspec для will_paginate. Проблема в том, что у меня есть модель с владельцем, у которого может быть много питомцев. Это приводит к файлу factory.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                 "[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, но я хочу сделать это правильно.

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

Ура Карл


person abegbg    schedule 07.10.2011    source источник


Ответы (1)


Ну, во-первых, выполнение @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.

person MrDanA    schedule 07.10.2011
comment
Великолепно! Это решило это. Думаю, мне еще многому предстоит научиться. (что довольно весело). Бесконечно благодарен! - person abegbg; 11.10.2011