2017-01-30 2 views
1

Je suis encore assez nouveau à Ruby on Rails et à tous ses gemmes associés, alors s'il vous plaît nus avec moi et me demander de fournir plus d'informations si cela est nécessaire.Ruby on Rails avec RSpec et shoulda-matcher validate_inclusion_of donner NoMethodError

Je rencontre des problèmes avec validate_inclusion_of matcher lors de l'écriture d'une spécification.

Mes spécifications actuelles concernent les utilisateurs et les groupes d'utilisateurs. Un utilisateur a un identifiant de groupe d'utilisateurs.

Je souhaite vérifier que l'ID du groupe d'utilisateurs d'un utilisateur figure réellement dans la liste des ID de groupes d'utilisateurs actuels.

Au moment de mon spec est essentiellement:



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 

mais l'erreur que je reçois est:



    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 

J'ai essayé différentes choses différentes et en utilisant byebug etc. débogués mais rien ne fonctionne pour moi.

par exemple.

Ajouter à



    @company_user_group_id = @company_user.company_user_group_id 

et changer la ligne de is_expected.to à


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

Je reçois l'erreur suivante


    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 

Il semble donc que l'ID de groupe pour vérifier est valide (par exemple 8) et le tableau est valide (par exemple 8 et 9) mais la correspondance ne fonctionne pas.

Toute aide très appréciée!

Une partie du modèle de l'utilisateur de l'entreprise



    # 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 

Si le « sauf si: « ? Rails.env.test » » bit est supprimé, la plupart des spécifications échouent pour une raison inconnue. Juste mentionné au cas où c'est pertinent.

et la méthode suivante à partir du modèle du groupe Société



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

+0

Pouvez-vous poster le code que vous testez en fait, ainsi que le test s'il vous plaît. –

+0

Comme dans certains modèles d'entreprise? – Iain

+0

Oui, et aussi 'CompanyUserGroup.full_list_of_ids' –

Répondre

0

Je l'ai compris. Pour une raison quelconque, validate_inclusion_of fonctionne quand il est dans un let! bloc.

Peu importe quel argument est envoyé à la méthode let helper, seulement celui-ci l'est.

Encore ne sais pas POURQUOI cela résout cependant, si quelqu'un peut m'éclairer !?

Ainsi, la spécification suivante passe maintenant


    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

Je pense que vous voulez quelque chose comme ceci:

Vous pourriez même pas besoin de définir le gropu utilisateur de l'entreprise de l'utilisateur de l'entreprise .

Mais vous avez

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

Ce qui signifie sûrement qu'il échouerait parce que vous ne le faites pas dans l'environnement de test

+0

même erreur 1) CompanyUser company_user_group liste des validations d'identité valides doivent confirmer que: company_user_group_id est soit <8> ou <9> Panne/Erreur: attendre (@company_user) .à validate_inclusion_of (: company_user_group_id) .in_array (CompanyUserGroup .full_list_of_ids) NoMethodError: méthode undefined 'attribute_setter 'pour nil: NilClass – Iain

+0

J'ai ensuite enlevé le bit", sauf:' Rails.env.test? '"dans le modèle, mais beaucoup d'autres spécifications échouent et l'erreur pour le ci-dessus changements de spécification à CompanyUser validations company_user_group liste d'ID valides Échec/Erreur: @company_user = FactoryGirl.create (: company_user, id: 1) ActiveRecord :: RecordInvalid: Échec de la validation: Le groupe d'utilisateurs de la société n'est pas inclus dans la liste – Iain

+0

Je dois également signaler que dans factory girl, lorsqu'un utilisateur est créé, l'identifiant de groupe de la première ligne est affecté et si cela n'existe pas, un nouveau groupe est créé et cet identifiant est attribué à l'utilisateur. c'est-à-dire company_user_group_id {(CompanyUserGroup.first || FactoryGirl.create (: company_user_group)). id} – Iain