2012-04-12 57 views
3

行,所以我想测试我们需要一个管理员用户的特点和我试图以管理员身份登录,但为了做到这一点,我需要有一个管理员用户如何使用Factory Girl创建管理员角色?

这里是我的代码

let(:user) { FactoryGirl.create(:user) } 
    let(:admin_role) { FactoryGirl.create(:role) } 

FactoryGirl.define do 
    factory :user do 
    first_name "John" 
    last_name "Doe" 
    email "[email protected]" 
    end 

    factory :role do 
    name "Admin" 
    end 
end 

我如何连接这些我想user.roles << user_role,但得到这个错误

/Users/matt/Sites/application/spec/controllers/directory_controller_spec.rb:16:in `block (3 levels) in <top (required)>': undefined local variable or method `user' for #<Class:0x007fa550890d80> (NameError) 

这里是我的模型

class User < ActiveRecord::Base 
    has_many :roles, :through => :role_users 
    has_many :role_users 
    ... 

class Role < ActiveRecord::Base 
    has_many :users, :through => :role_users 
    has_many :role_users 
    ... 

class RoleUser < ActiveRecord::Base 
    belongs_to :role 
    belongs_to :user 
end 

回答

7
FactoryGirl.define do 
    factory :user do 
    first_name "John" 
    last_name "Doe" 
    email "[email protected]" 
    end 

    factory :admin_user, :parent => :user do 
    roles  { [ FactoryGirl.create(:admin_role) ] } 
    end 

    factory :role do 
    name  { "Role_#{rand(9999)}" } 
    end 

    factory :admin_role, :parent => :role do 
    name "Admin" 
    end 
end 
+0

你会如何使用这个在描述 – Trace 2012-04-12 21:25:32

+0

您是否正在寻找的anwser FactoryGirl.create(:admin_user) – 2012-04-13 14:01:58

+0

我试过了,并获得和错误....我会贴现在 – Trace 2012-04-13 14:14:15

0

解决

Factory.sequence(:email) {|n| "person#{n}@example.com" } 

Factory.define :role do |r| 
    r.name {"Admin"} 
end 

Factory.define :role_user do |ru| 
    ru.association(:role) 
    ru.association(:user) 
end 

Factory.define :user do |u| 
    u.first_name {"matt"} 
    u.last_name {"jones"} 
    u.email {Factory.next(:email)} 
end 

,并用它像

let(:role_user) { FactoryGirl.create(:role_user) } 
    before { sign_in(role_user) } 
0

我有完全相同的问题,用类似的代码:

describe "..." do 
    let(:user) { create :user } 
    let(:manager) { create :manager_role } 
    user.roles << manager 

    it "should ...." do 
    # etc. 
    end 

end 

# run rspec... 
# => `block (2 levels) in <top (required)>': undefined local variable or method `user' for #<Class:0x000001016a2dc0> (NameError) 

当我移动user.roles << manager代码进入before(:each)块,错误消失ARED。因此,像:

describe "..." do 
    let(:user) { create :user } 
    let(:manager) { create :manager_role } 

    before(:each) do 
    user.roles << manager 
    end 

    it "should ...." do 
    # etc. 
    end 

end 

这节省了您的工厂指定role <-> user协会的痛苦。

我不是如何RSpec的和factory_girl工作不够熟悉,理解你为什么打电话let(:user) { create :user },但把它变成一个before(:each)块或成个人it "should ... " do块应该做的伎俩后不能有像user.roles << role代码。

相关问题