2017-01-30 14 views
1

Я по-прежнему довольно новичок в Ruby on Rails и всех связанных с ним драгоценных камнях и т. Д., Поэтому, пожалуйста, со мной и попроси меня предоставить дополнительную информацию, если это необходимо.Ruby on Rails с RSpec и соавтором validate_inclusion_of, предоставляющим NoMethodError

У меня возникли проблемы с совпадением validate_inclusion_of при написании спецификации.

Мои текущие спецификации относятся к пользователям и группам пользователей. У пользователя есть идентификатор группы пользователей.

Я хочу проверить, что идентификатор группы пользователей пользователя фактически находится в списке идентификаторов текущей группы пользователей.

На данный момент мой спецификации в основном:



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 

и изменяя is_expected.to строку


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

Я получаю следующую ошибку


    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 

Таким образом, кажется, что идентификатор группы, чтобы проверить, (например, 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»бит не будет удален, большинство из спецификации терпит неудачу по неизвестной причине. Просто упоминается в случае, если это имеет значение.

и следующий метод из модели компании группы



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

+0

Вы можете разместить код, который вы на самом деле тестирования, а также тест пожалуйста. –

+0

Как и в некоторых моделях компании? – Iain

+0

Да, а также 'CompanyUserGroup.full_list_of_ids' –

ответ

0

Я понял это. По какой-то причине validate_inclusion_of работает, когда он находится в пределах let! блок.

Не имеет значения, какой аргумент отправлен методу let helper, только тот.

По-прежнему не знаю, ПОЧЕМУ это исправление, хотя, если кто-нибудь может просветить меня !?

Итак, следующие спецификации в настоящее время проходит


    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

Я думаю, что вы хотите что-то вроде этого:

Вы можете даже не нужно, чтобы установить пользователь компании gropu пользователя компании ,

Но вы

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

Который, конечно, означает, что она потерпит неудачу, потому что вы не делаете, что в тестовой среде

+0

Увы же ошибка 1) CompanyUser Validations company_user_group список допустимых идентификаторов необходимо проверить, что: company_user_group_id либо <8> или <9> Сбой/Ошибка: ожидать (@company_user) .то validate_inclusion_of (: company_user_group_id) .in_array (CompanyUserGroup .full_list_of_ids) NoMethodError: undefined method 'attribute_setter 'для nil: NilClass – Iain

+0

Затем я удалил бит«, если только: Rails.env.test? »в модели, но многие другие спецификации терпят неудачу, а ошибка для выше спецификации изменяется на Подтверждения компанииUser company_user_group список допустимых идентификаторов Ошибка/ошибка: @company_user = FactoryGirl.create (: company_user, id: 1) ActiveRecord :: RecordInvalid: Не удалось выполнить проверку: группа пользователей компании не включена в список – Iain

+0

Я также должен указать, что на фабричной девушке, когда пользователь создан, назначается идентификатор группы первой строки, и если это doesn 't существует, создается новая группа и этот идентификатор присваивается пользователю. т. е. company_user_group_id {(CompanyUserGroup.first || FactoryGirl.create (: company_user_group)). id} – Iain