2017-01-30 15 views
1

저는 아직 Ruby on Rails와 관련된 모든 보석들에 대해 매우 새로운 편입니다. 그래서 나와 필요가있는 경우 더 자세한 정보를 제공 해주시기 바랍니다.RSpec과 shoulda-matcher가있는 Ruby on Rails NoMethodError를 제공하는 validate_inclusion_of

사양 작성시 validate_inclusion_of 정규식에 문제가 있습니다.

내 현재 사양은 사용자 및 사용자 그룹과 관련이 있습니다. 사용자에게 사용자 그룹 ID가 있습니다.

사용자의 사용자 그룹 ID가 현재 사용자 그룹 ID 목록에 실제로 있는지 확인하고 싶습니다.



describe 'company_user_group list of valid IDs' do 
    let!(:company_user_group_everything) { FactoryGirl.create(:company_user_group_everything) } 
    let!(:company_user_group_nothing) { FactoryGirl.create(:company_user_group_nothing) } 
    it '' do 
    @company_user = FactoryGirl.create(:company_user, id: 1) 
    CompanyUser.current_id = @company_user.id 

    is_expected.to validate_inclusion_of(:company_user_group_id).in_array(CompanyUserGroup.full_list_of_ids) 
    end 
end 

하지만 내가 오류는 다음과 같습니다 : 순간 내 사양에서

은 기본적으로



    1) CompanyUser validations company_user_group list of valid IDs should validate that :company_user_group_id is either ‹2› or ‹3› 
     Failure/Error: is_expected.to validate_inclusion_of(:company_user_group_id).in_array(CompanyUserGroup.full_list_of_ids) 

     NoMethodError: 
      undefined method `attribute_setter' for nil:NilClass 

내가 여러 가지 다른 일을 시도 등 byebug 사용하여 디버깅하지만 아무것도 작동하지 않습니다 나를 위해.



    @company_user_group_id = @company_user.company_user_group_id 

에 추가 내가


    1) CompanyUser validations company_user_group list of valid IDs should validate that :8 is either ‹8› or ‹9› 
    Failure/Error: is_expected.to validate_inclusion_of(@company_user_group_id).in_array(CompanyUserGroup.full_list_of_ids) 

    Shoulda::Matchers::ActiveModel::AllowValueMatcher::AttributeDoesNotExistError: 
     The matcher attempted to set :8 on the CompanyUser to 8, but that 
     attribute does not exist 

그래서는 그룹 ID가 확인하는 것 같다 다음과 같은 오류를 얻을


    is_expected.to validate_inclusion_of(@company_user_group_id).in_array(CompanyUserGroup.full_list_of_ids) 

에 is_expected.to 라인을 변경 유효하고 (예 : 8) 어레이가 유효하지만 (예 : 8과 9) 일치가 작동하지 않습니다.

많은 도움을 주셨습니다.



    # This model holds User identities for internal staff. This model is 
    # primarily intended for use in the xxxx application. 
    class CompanyUser LT ActiveRecord::Base 
     acts_as_authentic do |c| 

     c.merge_validates_uniqueness_of_email_field_options case_sensitive: false 
     c.merge_validates_length_of_password_field_options minimum: 8 

     if Rails.env.production? 
      c.logged_in_timeout = 30.minutes 
     else 
      c.logged_in_timeout = 90.minutes 
     end 
     end 

     # Constants 

     # relationships 
     belongs_to :company_user_group 

     # validations 
     validates :first_name, presence: true, length: { maximum: 20 } 
     validates :last_name, presence: true, length: { maximum: 20 } 
     validates :company_user_group_id, presence: true, numericality: { only_integer: true, greater_than: 0 } 
     validates :company_user_group_id, inclusion: { in: CompanyUserGroup.full_list_of_ids }, unless: 'Rails.env.test?' 
     validate :check_sys_admin_permission 

하면 회사의 사용자 모델의 일부 "하지 않는 '? Rails.env.test'"비트가 제거되고, 사양의 대부분은 어떤 알 수없는 이유로 실패합니다. 관련성이있는 경우에 대해 언급했습니다.

당신은 심지어 회사 사용자의 기업 사용자 gropu을 설정할 필요가 없습니다 수 있습니다

및 회사 그룹 모델에서 다음 방법은 내가 생각



     # class methods 
     def self.full_list_of_ids 
     CompanyUserGroup.all.pluck(:id) 
     end 

+0

당신이 실제로 테스트하는 코드뿐만 아니라 테스트를 게시 할 수 전달하시기 바랍니다. –

+0

일부 회사 모델과 마찬가지로? – Iain

+0

예, 또한'CompanyUserGroup.full_list_of_ids' –

답변

0

에 내가 알아 낸 것을하지 않기 때문에 그것은 실패 의미

validates :company_user_group_id, inclusion: { in: CompanyUserGroup.full_list_of_ids }, unless: 'Rails.env.test?' 

있어요. 어떤 이유로 든 validate_inclusion_of는 let! 내에있을 때 작동합니다! 블록.

let 헬퍼 메서드에 전달되는 인수는 중요하지 않습니다.

아직도 누군가가 나에게 계몽 할 수있는 경우에도이 문제가 해결되는 이유를 모르겠다!?

그래서, 다음과 같은 사양 지금


    describe 'company_user_group list of valid IDs' do 
     let!(:company_user_group_everything) { FactoryGirl.create(:company_user_group_everything) } 
     let!(:company_user_group_nothing) { FactoryGirl.create(:company_user_group_nothing) } 

     let!(:temp) do 
     it {is_expected.to validate_inclusion_of(:company_user_group_id).in_array(CompanyUserGroup.full_list_of_ids)} 
     end 

    end 
0

당신이 뭔가를 원하는 .

하지만 당신은 분명히 당신이 테스트 환경

+0

: company_user_group_id이다 어느 <8> 또는 <9> 실패/오류 : 기대 (@company_user) .TO validate_inclusion_of (: company_user_group_id) .in_array (CompanyUserGroup .full_list_of_ids) NoMethodError : 정의되지 않은 메소드 nilClass에 대한 'attribute_setter' – Iain

+0

모델에서 ', unless : Rails.env.test?' "비트를 제거했지만 다른 많은 스펙이 실패하고 위 사양 변경 회사 사용자 인증 company_user_group 유효한 ID 목록 오류/오류 : @ company_user = FactoryGirl.create (: company_user, id : 1) ActiveRecord :: RecordInvalid : 유효성 검사 실패 : 회사 사용자 그룹이 목록에 포함되어 있지 않음 – Iain

+0

공장 소녀의 경우 사용자가 생성되면 첫 번째 행의 그룹 ID가 할당되고 새로운 그룹이 생성되고 해당 ID가 사용자에게 할당됩니다. 즉, company_user_group_id {(CompanyUserGroup.first || FactoryGirl.create (: company_user_group))} id} – Iain