factory_girl вьется над ассоциациями (бесконечный цикл, может быть?) - PullRequest
1 голос
/ 15 марта 2011

Что у меня сейчас:

class User < ActiveRecord::Base
   has_many :people
end

... и ...

class Person < ActiveRecord::Base
   belongs_to :user
end

В spec/factories.rb:

Factory.define :user do |u|
  u.email "test@test.com"
  u.password "testpassword"
  u.password_confirmation "testpassword"
  u.display_name "neezer"
  # u.people { |i| [i.association(:person)] }
end

Factory.define :person do |p|
  p.first_name "p_firstname"
  p.last_name "p_lastname"
  p.gender "male"
  p.association :user
end

Я хочу настроить фабрику пользователей на создание ассоциации с 1 человеком, но если я раскомментирую эту строку, когда я запускаю свои тесты, моя система довольно долго зависает, прежде чем вывести этот сбой:

1) User can be created from a factory
     Failure/Error: Unable to find matching line from backtrace
     SystemStackError:
       stack level too deep
     # /Users/test/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.5/lib/active_record/persistence.rb:285

Что я здесь не так делаю? Я хотел бы иметь тесты, которые требуют связи между этими двумя моделями, так что (1) a User должен иметь по крайней мере 1 человека, и (2) Person должен принадлежать User.

Это приоритетная проблема? Я признаю, что я немного потерян здесь ...


Я использую rspec 2.5.0, factory_girl_rails 1.0.1 и rails 3.0.5.


Мои характеристики:

user_spec.rb

require 'spec_helper'

describe User do

  subject { Factory :user }

  # ...

  context "has associations, " do

    it "can have people" do
      subject.should respond_to :people
    end

    it "must have at least 1 person" do
      subject.send "people=", nil
      subject.should_not be_valid
      subject.errors[:people].should_not be_empty
    end

  end

end

person_spec.rb

require 'spec_helper'

describe Person do

  subject { Factory :person }

  # ...

  context "has validation, " do

    [:gender, :user].each do |attr|

      it "must have a #{ attr }" do
        subject.send "#{attr}=", nil
        subject.should_not be_valid
        subject.errors[attr].should_not be_empty
      end

    end

  end

  context "has associations, " do

    it "can have a User" do
      subject.should respond_to :user
    end

  end

end

Ответы [ 2 ]

1 голос
/ 15 марта 2011

Сохраните эту строку, но удалите p.association :user с вашего личного завода.

0 голосов
/ 08 июня 2011

С тех пор я обнаружил Стоит , который предоставляет хорошие rspec-сопоставители, подобные этим:

subject.should belong_to :user
subject.should have_many :people

, который решил мою проблему.

...