2013-03-09 4 views
1

사용자 모델 (devise + cancan)의 인증을 테스트하는 기능을 작성하려고합니다. 사용자에게는 다른 역할이 부여 될 수 있습니다. 요점은 인증 된 사용자가 역할 중 하나 ("admin"또는 "registered") 중 하나를 가질 때 기능을 테스트하는 것입니다. 기본적으로 사용자는 "등록 된"역할을 갖는 것으로 작성됩니다. 나는 rails3-devise-rspec-cucumberAuthorization and users management in rails을 시작으로 사용하고 있습니다.오이 기발한

그래서있어 다음 표

sqlite> .tables 
roles_users  users     views   
roles    schema_migrations 

응용 프로그램/모델/user.rb

class User < ActiveRecord::Base 
    has_and_belongs_to_many :roles 
    before_save :setup_role 
... 
def setup_role 
    if self.role_ids.empty?  
     self.role_ids = 2 # corresponds to "registered" 
    end 
    end 
end 

응용 프로그램/모델/role.rb

class Role < ActiveRecord::Base 
    has_and_belongs_to_many :users 
    attr_accessible :name 
end 

기능/user_authentication . 특징

나는 오이를 실행하면 10

기능/step_definitions/user_definition.rb

... 
def create_user 
    create_visitor 
    delete_user 
    @user = FactoryGirl.create(:user, @visitor) 
end  
    ... 
Given /^I exist as a user$/ do 
create_user 
end 

사양/공장

FactoryGirl.define do 
    factory :user do 
    email '[email protected]' 
    password 'changeme' 
    password_confirmation 'changeme' 
    end 
    factory :role do 
    role_id 2 
    end 
end 

, 나는 오류 얻을 user.rb/

Scenario: User signs in successfully  # features/user_authentication.feature:12 
Given I exist as a user     # features/step_definitions/user_definition.rb:58 
    Couldn't find Role with id=2 (ActiveRecord::RecordNotFound) 
    ./app/models/user.rb:21:in `setup_role' 

나는 내가 공장이나 협회를 잃어 버렸음에 틀림 없다고 생각한다. 그러나 나는 그 주제를 처음 접했고 n 문제를 해결하는 방법을 알아 냈습니다. 당신의 충고에 감사드립니다.

답변

0

당신은

FactoryGirl.define do 
    factory :user do 
    email '[email protected]' 
    password 'changeme' 
    password_confirmation 'changeme' 
    end 
    factory :role do 
    id 2 
    name 'registered' 
    end 
end 

Roleid에 FactoryGirl 정의를 변경할 수 있으며,이 모든 참조 role_id된다. 따라서 id과 함께 Role을 설정해야합니다.