2013-12-03 3 views
0

Я пытаюсь справиться с TDD в Rails. Я уверен, что это очень пустой вопрос, но здесь.Как определить has_many через отношения с FactoryGirl?

У меня есть следующие модели

class User 
    has_many :users_roles 
    has_many :roles, :through => :users_roles 
end 

class Role 
    has_many :users_roles 
    has_many :users, :through => :users_roles 
end 

class UserRole 
    belongs_to :user 
    belongs_to :role 
end 

У меня есть seed.rb, который генерирует роли, используемые приложением.

Role.create([ 
    { :name => "Admin" }, 
    { :name => "User" } 
]) 

Я использую Factory Girl и пытаюсь определить пользователя с ролью. Я пробовал множество подходов и ссылался на другие вопросы по SO и другим источникам, но мне ничего не подошло.

Завод в настоящее время выглядит следующим образом

FactoryGirl.define do 
    factory :user do 
    sequence(:email) { |n| "User_Email_#{n}@example.com" } 
    trait :is_admin do 
     association roles << Role.find_by_name("Admin") 
    end 
    end 
end 

Как создать пользователь с соответствующей ролью в FactoryGirl, учитывая, что (а) они имеют has_many через отношения, и (б) роль уже существует в базе данных и не нужно создавать FactoryGirl.

ответ

0

Вы можете назначить has_many ассоциацию, как и любой другой атрибут:

FactoryGirl.define do 
    factory :user do 
    sequence(:email) { |n| "User_Email_#{n}@example.com" } 
    trait :is_admin do 
     roles { [Role.find_by_name("Admin")] } 
    end 
    end 
end 
0

Один вариант

factory :admin_user do 
    roles { [ Role.find_by_name("Admin") ] } 
end 

, но это не позволяет создать пользователя с несколькими ролями

другой вариант: вы можете попробовать чего-л, как этот

trait :is_admin do 
    after(:build) do |user| 
    user.roles << Role.find_by_name("Admin") 
    # or 
    # user.roles = user.roles + [Role.find_by_name("Admin")] 
    end 
end 

Я не являюсь если << работает для встроенного (не сохраненного) объекта.

Смежные вопросы