我该如何测试Rails Enums?

时间:2015-04-09 23:45:47

标签: ruby-on-rails ruby-on-rails-4 testing enums rails-activerecord

假设我有一个名为CreditCard的模型。由于某些技术限制,最好将卡网络表示为枚举。我的代码看起来像这样:

class CreditCard < ActiveRecord::Base
   enum network: [:visa, :mastercard, :amex]
end

使用枚举时应该测试什么?

2 个答案:

答案 0 :(得分:8)

如果您使用数组,则需要确保订单保持不变:

class CreditCard < ActiveRecord::Base
  enum network: [:visa, :mastercard, :amex]
end

describe CreditCard, '#status' do
  let(:network) { [:visa, :mastercard, :amex] }

  it 'has the right index' do
    network.each_with_index do |item, index|
      expect(described_class.statuses[item]).to eq index
    end
  end
end

如果使用哈希,顺序无关紧要,但每个键的值都会。因此,确保每个密钥的编号都​​相同,这总是好的。

答案 1 :(得分:1)

根据Enum的Rails文档,数组的每个值都对应一个整数。我猜测你想测试网络阵列总是保持相同的顺序。如果您正在使用rspec,则可以执行以下操作:

describe 'CreditCard' do
  let(:network_values) do
    { visa: 0,
      master: 1
      # etc
    }
  end
  subject { described_class.new }

  it 'has valid a network' do 
    network_values.each do |type, value|
      subject.network = value
      subject.save 
      expect(subject.network).to eql(type.to_s)
    end 
  end 
end 

ps:我是用手机写的,也许你需要做一些调整才能运行