2015-04-21 14 views
11

Tôi đang sử dụng Rails 4 enums và tôi muốn đúng cách kiểm tra chúng, vì vậy tôi thiết lập các bài kiểm tra lên cho các lĩnh vực enum của tôi:Rails - xác nhận thử nghiệm lĩnh vực enum

it { should validate_inclusion_of(:category).in_array(%w[sale sale_with_tax fees lease tax_free other payroll]) } 
it { should validate_inclusion_of(:type).in_array(%w[receivable payable]) } 

Và đây là mô hình họ tái xác nhận:

class Invoice < ActiveRecord::Base 
    belongs_to :user 

    enum category: [:sale, :sale_with_tax, :fees, :lease, :tax_free, :other, :payroll] 
    enum type: [:receivable, :payable] 

    validates :user, presence: true 
    validates :issue_date, presence: true 
    validates :series, presence: true 
    validates :folio, presence: true 
    validates :issuing_location, presence: true 
    validates :payment_method, presence: true 
    validates :last_digits, presence: true 
    validates :credit_note, presence: true 
    validates :total, presence: true 
    validates :subtotal, presence: true 
    validates :category, presence: true 
    validates_inclusion_of :category, in: Invoice.categories.keys 
    validates :type, presence: true 
    validates_inclusion_of :type, in: Invoice.types.keys 
end 

Nhưng khi tôi chạy thử nghiệm tôi nhận được:

1) Invoice should ensure inclusion of type in [0, 1] 
    Failure/Error: it { should validate_inclusion_of(:type).in_array([0,1]) } 
    ArgumentError: 
     '123456789' is not a valid type 
    # ./spec/models/invoice_spec.rb:20:in `block (2 levels) in <top (required)>' 

    2) Invoice should ensure inclusion of category in [0, 1, 2, 3, 4, 5, 6] 
    Failure/Error: it { should validate_inclusion_of(:category).in_array([0,1,2,3,4,5,6]) } 
    ArgumentError: 
     '123456789' is not a valid category 
    # ./spec/models/invoice_spec.rb:19:in `block (2 levels) in <top (required)>' 

tôi cũng đã thử với các giá trị chuỗi trong mảng kiểm tra, b Tôi nhận được cùng một lỗi và tôi thực sự không hiểu nó.

+1

Câu hỏi này là một bản sao của http://stackoverflow.com/questions/25597031/rails-4-enum-validation. Như Albertis nói đúng, "Tôi không chắc rằng việc xác thực này có ý nghĩa, vì cố gắng gán giá trị không hợp lệ cho trạng thái làm tăng một ArgumentError" – ctc

+0

Có thể không liên quan, nhưng chắc chắn là một điều thú vị: [Sử dụng Enum như trừu tượng khi thử nghiệm] (http://craftingruby.com/posts/2015/07/07/using-enumerable-as-abstraction-when-testing.html) – onebree

Trả lời

6

Sử dụng quẹt shoulda chúng ta có thể sử dụng sau đây để kiểm tra enum

it { should define_enum_for(:type).with([:receivable, :payable]) } 

it { should define_enum_for(:category). 
      with(:sale, :sale_with_tax, :fees, :lease, :tax_free, :other, :payroll) } 
2

Hãy thử điều này:

it { should validate_inclusion_of(:category).in_array(%w[sale sale_with_tax fees lease tax_free other payroll].map(&:to_sym)) }

Bên cạnh đó, đối với mã dọn dẹp, hãy thử đặt các hạng mục/loại có giá trị trong một hằng số tương ứng. Ví dụ:

class Invoice < ActiveRecord::Base 
    INVOICE_CATEGORIES = [:sale, :sale_with_tax, :fees, :lease, :tax_free, :other, :payroll] 
    enum category: INVOICE_CATEGORIES 
end 
+1

Cùng một vấn đề với giải pháp của bạn, cảm ơn các mẹo dọn dẹp. – 8vius

2

di cư của bạn có thể là vấn đề, nó sẽ giống như thế:

t.integer :type, default: 1

Bạn cũng có thể xem xét thử nghiệm này một cách khác.

Có lẽ giống như:

it "validates the category" do 
    expect(invoice with category fee).to be_valid 
end 
+0

Quá trình di chuyển trông giống như mặc định là 0 vì các giá trị bắt đầu từ đó. Và không xem xét nó theo cách đó, có thể là đủ. – 8vius

+0

cách tốt nhất để sử dụng cú pháp Rspec mới (ý kiến) và tốt hơn là kiểm tra tính hợp lệ thay vì thử nghiệm trực tiếp trong các trường hợp như thế này. –

0

Bạn có chuỗi này trong kiểm chứng thực của bạn:

validates_inclusion_of :category, in: Invoice.categories.keys 

trong trường hợp của enum Invoice.categories.keys # => [ "bán", "sale_with_tax" , "phí", "thuê", "tax_free", "khác", "biên chế"]

Bạn nên cập nhật dữ liệu đối tượng của mình bằng một trong các tên của enum.

Các vấn đề liên quan