Я изо всех сил пытался понять, почему я могу легко использовать seed.rb для создания новых пользователей и их ассоциаций по умолчанию, но при запуске отдельных юнит-тестов возникают ошибки.Я пытался обойти вызов «Роль», так как это вызывает ошибки в модульном тесте.Я относительно новичок в модульном тестировании, но использую Rails уже несколько лет.Хотя все это работает, я хочу, чтобы тесты прошли без ошибок.
ruby 1.8.7
gem 1.3.7
Rails 2.3.8
app / models / user.rb
class User < ActiveRecord::Base
has_many :user_roles, :dependent => :destroy
has_many :roles, :through => :user_roles, :uniq => true, :order => :id
has_one :contact, :as => :owner, :dependent => :destroy
attr_accessor :password
before_save :build_default_associations, :if => :new_record?
def build_default_associations
update_encrypted_password
build_contact(:email => name)
user_roles.build(:role_id => Role.find_by_name("subscriber")id )
#
# the below also works in seeds.rb but causes a different error
# roles << Role.find_by_name("subscriber")
# ActiveRecord::AssociationTypeMismatch: Role(#2162845660) expected, got NilClass(#2148404100)
#
end
db / seed.rb
# This places the default Role in the db
Role.create({:name => "subscriber", :description => "This will be the default"})
# associations initialize and save with
User.create(:name => "valid@email.com", :password => "abcde")
test / unit / user_test.rb
# assertions DO NOT fail, but raise the error below!
def test_should_create_user_and_add_default_role
user = User.create(:name => 'ok@good.org', :password => 'abcde') #minimum length password
assert !user.new_record?
assert user.roles.exists?("subscriber")
end
ruby test / unit / user_test.rb
1) Ошибка:
test_should_create_user_and_add_default_role (UserTest):
RuntimeError: Вызывается id для nil, который по ошибке будет равен 4 - если вы действительно хотите идентификатор nil, используйте object_id
app / models / user.rb:31: в 'build_default_associations'
unit / user_test.rb: 31: в `test_should_create_user_and_add_default_role '
Есть мысли?Кажется, я не могу найти лучшие практики, которые запрещают это ...