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
Pouvez-vous poster le code que vous testez en fait, ainsi que le test s'il vous plaît. –
Comme dans certains modèles d'entreprise? – Iain
Oui, et aussi 'CompanyUserGroup.full_list_of_ids' –