Что у меня сейчас:
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