带有RSpec的Ruby on Rails和带有NoMethodError的shoulda-matcher validate_inclusion_of

问题描述 投票:1回答:2

编写规范时,我遇到了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等进行了调试,但没有什么对我有用。

EG

加入



    @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

如果删除“除非:'Rails.env.test?'”位,大多数规范都会因某些未知原因而失败。刚才提到它是相关的。

以及公司组模型中的以下方法



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

ruby-on-rails rspec authlogic shoulda
2个回答
0
投票

我想你想要这样的东西:

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?'

这肯定意味着它会失败,因为你没有在测试环境中这样做


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
© www.soinside.com 2019 - 2024. All rights reserved.