Ruby on Rails with RSpec and shoulda-matcher validate_inclusion_of giving NoMethodError
Ruby on Rails with RSpec and shoulda-matcher validate_inclusion_of giving NoMethodError
我在编写规范时遇到 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
并将 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
看来要检查的组 ID 有效(例如 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
如果删除了 "unless: 'Rails.env.test?'" 位,则大多数规范会因某些未知原因而失败。刚刚提及以防相关。
以及公司组模型中的以下方法
# class methods
def self.full_list_of_ids
CompanyUserGroup.all.pluck(:id)
end
我想你想要这样的东西:
it '' do
@company_user = FactoryGirl.create(:company_user, id: 1)
@company_user.company_user_group = company_user_group_everything
expect(@company_user).to validate_inclusion_of(:company_user_group_id).in_array(CompanyUserGroup.full_list_of_ids)
end
您甚至可能不需要设置公司用户的公司用户组。
但是你有
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
我在编写规范时遇到 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
并将 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
看来要检查的组 ID 有效(例如 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
如果删除了 "unless: 'Rails.env.test?'" 位,则大多数规范会因某些未知原因而失败。刚刚提及以防相关。
以及公司组模型中的以下方法
# class methods
def self.full_list_of_ids
CompanyUserGroup.all.pluck(:id)
end
我想你想要这样的东西:
it '' do
@company_user = FactoryGirl.create(:company_user, id: 1)
@company_user.company_user_group = company_user_group_everything
expect(@company_user).to validate_inclusion_of(:company_user_group_id).in_array(CompanyUserGroup.full_list_of_ids)
end
您甚至可能不需要设置公司用户的公司用户组。
但是你有
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