brainspec/enumerize

NoMethodError: undefined method `values' for nil:NilClass

Closed this issue · 1 comments

guigs commented

Given

class Account < ApplicationRecord
  extend Enumerize
  enumerize :currency, in: %i[eur usd]

  def api_params
    { 
      currency: currency.upcase,
      version: 2
    }
  end
end

RSpec.describe Account do
  describe '#api_params' do
    account = Account.new(currency: 'eur')
    it 'returns api params' do
      expect(account.api_params).to eq(currency: 'EUR', version: 1)
    end
  end
end

Expected result when running spec

expected: {:currency=>"EUR", :version=>2}
     got: {:currency=>"EUR", :version=>1}

(compared using ==)

Diff:
@@ -1,3 +1,3 @@
 :currency => "EUR",
-:version => 2,
+:version => 1,

Actual result

NoMethodError: undefined method `values' for nil:NilClass

Backtrace shows the error is from lib/enumerize/predicatable.rb:20:in 'predicate_method?'

This is because rspec calls obj.respond_to?(:matches?) to show the failure message.

The problem is fixed if predicate_method? is changed to

method[-1] == '?' && @attr && @attr.values.include?(method[0..-2])

Any updates on this?