6

Tôi muốn thiết lập một bài kiểm tra Rails để kiểm tra các mô hình của mình mà không phải thiết lập toàn bộ môi trường Rails - Corey Haines trong số excellent blog post on the subject của anh ấy.yêu cầu mô hình ActiveRecord mà không cần phải yêu cầu toàn bộ sơ đồ lớp, cho active_record_spec_helper

(Tôi biết rằng Preloaders như mùa xuân hoặc Guard đi một phần của con đường hướng sửa chữa vấn đề này, nhưng tôi đồng ý với lập luận của Corey rằng đây là "thực sự chỉ là một băng cá nhân trong vấn đề thực sự".)

vì vậy, tôi đã thiết lập helper spec của tôi và các tập tin khác như đặt ra trong bài viết trên blog của Corey và - nhưng vấn đề của tôi là chính xác như tôi mô tả nó trong my comment trên cùng ý chính:

về cơ bản, mối liên quan giữa mô hình của tôi có ý nghĩa để kiểm tra một mô hình, tôi phải require rất nhiều tệp mô hình khác mà nó phủ nhận điểm sử dụng active_record_spec_helper ở vị trí đầu tiên .

Ví dụ: nếu tôi muốn thử nghiệm comment.rb nhưng nhận xét của tôi belongs_to :post, thì tôi phải yêu cầu post cũng như comment để làm cho thử nghiệm của tôi hoạt động. Nhưng sau đó Post có thể có các liên kết khác, ví dụ: belongs_to :user; has_many :drafts, vì vậy tôi phải yêu cầu userdrafts cũng chỉ để kiểm tra Comment ... sau đó userdrafts có các hiệp hội cũng vậy, và vân vân cho đến khi tôi kết thúc tải thực tế mỗi mô hình trong sơ đồ lớp học của tôi.

(Nếu điều này không có ý nghĩa, tôi đã đưa ra một lời giải thích chi tiết hơn trong the comment.)

Có thể làm việc xung quanh này và tránh được việc phải require tất cả những tập tin mô hình không liên quan? Hay có điều gì đó mang tính khái niệm mà tôi đang thiếu - liệu tôi có nên tránh liên kết tất cả các mô hình của tôi trong trang web khổng lồ này hay không thể tránh khỏi?

Hoặc là nó chỉ là không có giá trị nỗ lực và tôi nên dính với cho phép rails_helper tải toàn bộ môi trường?

Trả lời

2

Tôi không nghĩ rằng bạn đang thiếu bất kỳ khái niệm nào và tôi cho rằng các mô hình được liên kết trong một trang web khổng lồ thông qua các liên kết là tự nhiên trong các ứng dụng Rails lớn.

Đối với cách giải quyết cho vấn đề này, tôi có thể nghĩ ra nhiều:

  • Stub các mô hình được phụ thuộc vào khi thử nghiệm các mô hình phụ thuộc trực tiếp vào chúng. Điều này sẽ loại bỏ sự cần thiết phải tải hoặc stub các mô hình gián tiếp phụ thuộc vào.

  • Bật tự động tải. Mặc dù điều này sẽ làm chậm mọi thứ, nhưng không giống như khởi động tất cả Rails

  • Thay vì chỉ liệt kê các phụ thuộc của bạn làm nhận xét ở đầu mô hình của bạn như Corey đã đề xuất, hãy thể hiện chúng trong mã Ruby. Mã này có thể là sản phẩm không có trong sản xuất, nhưng trong thử nghiệm, bạn có thể cấu hình mã để yêu cầu hoặc cung cấp các phụ thuộc như bạn muốn.

+0

Tôi làm cách nào để bật tự động tải mà không tải toàn bộ ứng dụng Rails? Có ở đâu đó trong ActiveSupport không? – GMA

+0

Cơ chế tự động nạp của Ruby không đủ tự nó và tôi không chắc liệu cơ chế Rails được xây dựng trên đầu trang của nó có thể được gọi riêng. Có lẽ tôi không nên quá láu cá khi miêu tả lựa chọn đó. Nếu bạn không thể tìm thấy thứ gì đó trong đá quý Rails có thể sử dụng được, bạn có thể đọc về khả năng tại http://urbanautomaton.com/blog/2013/08/27/rails-autoloading-hell/, ví dụ và có lẽ cuộn của riêng bạn. –

0

Tôi đã có thể giải quyết vấn đề này bằng cách sử dụng FactoryGirl. Vui lòng see my gist for details.

Sử dụng factory_girl_require_helper.rb, bạn có thể làm một cái gì đó như thế này ở trên cùng của thử nghiệm của bạn:

require_factory_and_model_for(:comment) 

Điều đó sẽ tự động tải bất kỳ mô hình liên quan mà phụ thuộc vào các Comment dựa trên máy bạn đã xác định cho nó.

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