2012-04-12 4 views
3

Ok donc je veux tester des fonctionnalités qui ont besoin d'un utilisateur admin et je suis en train de vous connecter en tant qu'administrateur mais pour faire que je besoin d'avoir un administrateurComment créer un rôle d'administrateur avec Factory girl?

ici est mon code

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 

comment puis-je les connecter J'ai essayé user.roles << user_role mais nous avons eu cette erreur

/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) 

Voici mes modèles

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 

Répondre

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

comment voulez-vous utiliser dans la description – Trace

+0

Vous cherchez le anwser FactoryGirl.create (: admin_user) –

+0

J'ai essayé et obtenu et l'erreur .... je vais coller maintenant – Trace

0

Résolu

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 

et en utilisant comme

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

Je faisais exactement le même problème, avec le code comme:

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) 

Lorsque je me suis déplacé le code user.roles << manager dans un bloc before(:each), les erreurs disparaissent ared. Ainsi, quelque chose comme:

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

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

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

end 

Cela permet d'économiser la douleur d'avoir à préciser l'association role <-> user dans vos usines.

Je ne suis pas assez au courant de la façon dont le travail rspec et factory_girl de comprendre pourquoi vous ne pouvez pas avoir le code comme user.roles << role immédiatement après avoir appelé let(:user) { create :user }, mais le mettre dans un bloc before(:each) ou dans un bloc it "should ... " do individuel devrait faire l'affaire.

Questions connexes