2012-06-11 38 views
6

Tôi có một mô hình ActiveRecord có một số cuộc gọi lại và xác thực tùy chỉnh mà tôi muốn kiểm tra. Nó có nghĩa là, tôi phải công khai tất cả chúng. Đó có phải là một thực hành tốt hay là có một giải pháp tốt hơn trong trường hợp này?Ruby on Rails: tất cả các phương thức gọi lại ActiveRecord của tôi có phải là riêng tư không?

Ví dụ về các phương pháp tôi muốn thử nghiệm:

def before_validation 
    original.edit(self) if original 
    end 

    validate :unique?, on: :create 

    def unique? 
    return true if original.blank? 
    errors.add(:base, 'The entry already exists') 
    false 
    end 

Nói cách khác:

  1. Nếu tôi muốn thử nghiệm phương pháp "before_validation", làm tôi phải thực hiện công khai và gọi test_object .before_validation trực tiếp trong tệp Rspec mô hình của tôi?
  2. Nếu tôi muốn kiểm tra không chỉ, phương thức xác thực tùy chỉnh duy nhất?() Được gọi là xác thực, mà còn là chính phương thức, tôi có phải tạo duy nhất không?() Công khai?

Vấn đề là, không phải phương pháp nào tôi đang sử dụng ngoài mô hình của mình (vì vậy chúng phải là riêng tư), nhưng làm cách nào tôi có thể kiểm tra mà không công khai chúng?

Trả lời

3

Thật dễ dàng để bị cuốn vào việc triển khai thử nghiệm, nhưng đây là một ứng cử viên tốt cho hành vi kiểm tra.

Hãy tự hỏi, bạn trước khi xác thực thực sự làm gì? Sau đó, làm cho mình một bài kiểm tra rằng, cho đầu vào nhất định, bạn sẽ nhận được kết quả đầu ra nhất định nếu và chỉ nếu trước khi xác nhận của bạn hoạt động.

Là một ví dụ đơn giản, hãy tưởng tượng bạn có một mô hình người dùng với một name thuộc tính đơn giản, và bạn có một before_validation mà chỉ đơn giản thực hiện:

name = "Auto-generated name." if name.blank? 

Sau đó, bạn có thể viết một bài kiểm tra cho nó như thế này:

it "gets an auto-generated name if none is specified." do 
    user = User.create! 
    user.name.should eq "Auto-generated name." 
end 

it "does not get an auto-generated name if one is specified." do 
    user = User.create!(:name => "Test Name") 
    user.name.should eq "Test Name" 
end 

Vì vậy, như bạn có thể thấy, thử nghiệm này không kiểm tra tính hợp lệ, nhưng nó không cần nó được công khai, bởi vì bạn chỉ đang thử nghiệm hành vi của nó. Cũng vậy với phương pháp unique? của bạn. Cung cấp cho nó đầu vào nhất định và kiểm tra hành vi, mà không cần phải quan tâm đến phương pháp cụ thể nào đã được sử dụng hoặc bất kỳ chi tiết triển khai nào khác.

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