2011-06-26 32 views
25

Tôi mới sử dụng các ứng dụng web Rails và RSpec. Tôi làm việc với mã kế thừa và cần thêm các bài kiểm tra. Vì vậy, cách tốt nhất để kiểm tra công cụ tìm và phạm vi được đặt tên với RSpec là gì?Đường ray: Kiểm tra phạm vi được đặt tên với RSpec

Tôi tìm thấy trong Google một vài cách tiếp cận nhưng chúng không lý tưởng. Ví dụ:

http://paulsturgess.co.uk/articles/show/93-using-rspec-to-test-a-named_scope-in-ruby-on-rails

it "excludes users that are not active" do 
    @user = Factory(:user, :active => false) 
    User.active.should_not include(@user) 
end 

hoặc

http://h1labs.com/notebook/2008/8/21/testing-named-scope-with-rspec

it "should have a published named scope that returns ..." do 
    Post.published.proxy_options.should == {:conditions => {:published => true}} 
end 

tôi tìm cách tiếp cận tốt nhất (IMHO) trong "đường sắt kiểm tra Đơn thuốc":

should_match_find_method :active_only { :active == true } 

nơi should_match_find_method phương thức trợ giúp tùy chỉnh

+2

kiểm tra phạm vi thực sự mang tính kinh nghiệm và tôi gắn bó với phương pháp đầu tiên bạn vạch trần ở đây – apneadiving

+4

Tôi đồng ý. Có gì sai với cách tiếp cận đầu tiên? Nó mô tả các hành vi thực sự thay vì kiểm tra (thực sự chỉ viết lại) có thể thiếu các tham số cấu hình. –

+0

@RobDavis "có thể thiếu thông số cấu hình" +1 –

Trả lời

29

Tác giả của RSpec gần đây đã viết blog ông nghĩ rằng Validations are behavior, associations are structure. Nói cách khác, ông thấy rằng các hiệp hội (và phạm vi) không nên được kiểm tra trực tiếp. Các thử nghiệm cho những điều này sẽ theo sau hành vi mà bạn muốn.

Nói cách khác, sự khôn ngoan hiện tại là không cần phải kiểm tra trực tiếp từng phạm vi, vì bạn sẽ bao gồm các liên kết này bằng cách kiểm tra hành vi ứng dụng của bạn.

+32

Tuy nhiên, anh ấy không đề cập gì về phạm vi trong bài đăng đó, tại sao bạn gộp chúng lại với các liên kết? Phạm vi có thể phức tạp hơn nhiều và dễ xảy ra lỗi hơn so với các liên kết và tôi tin rằng cần được kiểm tra. Vì bạn đã triệu tập người sáng tạo hùng mạnh, [ở đây] (http://groups.google.com/group/rspec/browse_thread/thread/6706c3f2cceef97f), anh ta gợi ý rằng nếu phạm vi nằm trong ô hành vi (và nếu nó không , tại sao nó có?), sau đó nó cần được xác định. –

+3

Tôi không đồng ý rằng không nên kiểm tra phạm vi. Họ chắc chắn nên. Chỉ cần không trực tiếp; việc thử nghiệm các phạm vi cần được thúc đẩy bằng cách kiểm tra hành vi của ứng dụng.Tôi thấy phạm vi tương tự như các hiệp hội, vì cả hai có thể có các tùy chọn phức tạp như tham gia, bao gồm các mô hình, trong đó/nhóm bởi/có etcetera. Trong mọi trường hợp, đây là những gì có ý nghĩa với tôi. –

0

Vấn đề với cách tiếp cận đầu tiên là nó thực sự truy vấn cơ sở dữ liệu. Nó rất chậm và không cần thiết. Nếu bạn không nhớ, bạn có thể sử dụng phương pháp đầu tiên một cách an toàn. Cách tiếp cận thứ hai là nhanh chóng và rõ ràng vì vậy tôi sẽ giới thiệu nó.

+2

Bạn có chắc chắn rằng truy vấn không cần thiết trong thông số mô hình không? Tôi có thể hiểu không làm điều đó trong một bộ điều khiển hoặc xem spec - giả & stub nó đi. Nhưng tôi nghĩ rằng bạn muốn thử nghiệm mô hình và mối quan hệ của nó với cơ sở dữ liệu ở đây. – jaydel

+0

IMO không cần thiết khi kiểm tra phạm vi được đặt tên. Bạn nên có rất nhiều bài kiểm tra khác mà thực sự đọc từ cơ sở dữ liệu. –

+14

Phạm vi là một lĩnh vực mà chắc chắn có ý nghĩa khi truy vấn cơ sở dữ liệu để tìm nạp các đối tượng thực. Tôi ủng hộ chế nhạo ở nơi thích hợp, nhưng chỉ những phạm vi đơn giản nhất mới hoạt động được với mocks. Một khi bạn bắt đầu tham gia hoặc nhóm, họ sẽ phá vỡ, và tôi đã làm cho nó một quy tắc để kiểm tra phạm vi chống lại một cửa hàng sao lưu thực sự. Các đối sánh dựa trên cấu hình như ví dụ thứ hai và thứ ba là lỗi dễ xảy ra, IMHO. Tức là, họ rất có khả năng có cùng lỗi với mã của bạn. –

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