2013-08-20 29 views
22

Tôi đã có một lớp, đó là cơ sở của một số lớp khác chuyên về các hành vi:kiểm tra đơn giản STI với FactoryGirl

class Task < ActiveRecord::Base 
    attr_accessible :type, :name, :command 
    validates_presence_of :type, :name, :command 

    # some methods I would like to test 

end 

Lớp CounterTask thừa hưởng từ công tác

class CounterTask < Task 
end 

này tất cả các công trình tốt cho đến khi tôi đang cố gắng kiểm tra lớp cơ sở, vì nó phải có một loại.

FactoryGirl.define do 
    factory :task do 
    sequence(:name) { |n| "name_#{n}" } 
    sequence(:command) { |n| "command_#{n}" } 
    end 
end 

Làm cách nào bạn kiểm tra chức năng cơ bản của lớp cha?

+3

Bạn không nên viết bài kiểm tra để kiểm tra chức năng, thay vì triển khai? Trong trường hợp này có nghĩa là bạn sẽ kiểm tra xem 'CounterTask' có các thuộc tính và những thứ khác mà nó nhận được từ' Task' hay không. Nếu bạn thay đổi việc triển khai, ví dụ như không sử dụng STI nữa. Thử nghiệm của bạn vẫn có thể thành công nếu 'CounterTask' của bạn giữ nguyên hành vi tương tự. – Arjan

+0

Đó là một điểm tốt. Tôi chỉ nghĩ rằng tôi sẽ tiết kiệm một số bản sao trong thử nghiệm nếu tôi lần đầu tiên kiểm tra các chức năng cơ bản và sau đó các lớp học trẻ em ... Có lẽ đây có thể là giải pháp cho vấn đề của tôi. – Mark

Trả lời

48

Bạn có thể khai báo các định nghĩa của các nhà máy như sau:

FactoryGirl.define do 
    factory :task, class: 'Task' do 
    shop 
    currency 
    value 10 
    end 

    factory :counter_task, parent: :task, class: 'CounterTask' do 
    end 
end 

Và bây giờ bạn có thể kiểm tra lớp cơ sở cách ly từ nhà máy riêng của mình và giống nhau cho mỗi lớp được thừa kế.

+2

Tôi chỉ cần chuyển tùy chọn 'class' tới nhà máy con để thực hiện công việc này:' factory: counter_task, class: 'CounterTask' do' (không có tùy chọn 'class' là cần thiết cho nhà máy cha). – gabe

+0

@gabe Bỏ qua 'class: 'Task'' cũng có tác dụng đối với tôi, nhưng' parent:: task' có vẻ quan trọng nếu bạn muốn các thuộc tính được định nghĩa trong khối nhiệm vụ được định nghĩa khi sử dụng counter_task. Vì vậy, với 'parent:: task',' build (: counter_task) .value == 10'. Nếu bạn không đặt parent, 'build (: counter_task) .value == nil'. – LiamD

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