2009-04-28 32 views
41

Tôi có một mô hình lấy dữ liệu từ một đối tượng phân tích cú pháp. Tôi nghĩ rằng các phân tích cú pháp lớp nên sống trong thư mục lib/(mặc dù tôi có thể được thuyết phục rằng nó nên sống ở đâu khác). Câu hỏi đặt ra là: Các bài kiểm tra đơn vị của tôi nên cho lớp phân tích cú pháp ở đâu? Và làm thế nào để đảm bảo rằng chúng được chạy mỗi khi tôi chạy thử nghiệm cào?Đường ray: Cách kiểm tra mã trong thư mục lib /?

Trả lời

24

Trong ứng dụng Rails tôi đang làm việc, tôi quyết định chỉ cần đặt các bài kiểm tra trong thư mục test\unit. Tôi cũng sẽ lồng ghép chúng theo mô-đun/thư mục, ví dụ:

lib/a.rb => test/unit/a_test.rb 
lib/b/c.rb => test/unit/b/c_test.rb 

Đối với tôi, đây là con đường kháng cuối cùng, khi các thử nghiệm này chạy mà không phải thực hiện bất kỳ thay đổi nào khác.

+2

Tính năng này không hoạt động nữa với Rails 5 – Qqwy

20

Dưới đây là một cách:

Tạo lib/tasks/test_lib_dir.rake như sau

namespace :test do 

    desc "Test lib source" 
    Rake::TestTask.new(:lib) do |t|  
    t.libs << "test" 
    t.pattern = 'test/lib/**/*_test.rb' 
    t.verbose = true  
    end 

end 

Mimic cấu trúc của lib dir của bạn dưới test dir, thay thế mã lib với các xét nghiệm tương ứng.

Chạy rake test:lib để chạy thử nghiệm lib của bạn.

Nếu bạn muốn tất cả các thử nghiệm chạy khi bạn gọi rake test, bạn có thể thêm phần sau vào tệp cào mới của mình.

lib_task = Rake::Task["test:lib"] 
test_task = Rake::Task[:test] 
test_task.enhance { lib_task.invoke } 
+0

Bằng cách nào đó nó không tải lên môi trường (cụ thể là 'fixturesSupport'' fixtures'), và không có cách nào để ép nó trong rakefile. –

+1

Hey, tôi đã thử giải pháp của bạn và kiểm tra 'rake: lib' chạy thử nghiệm của tôi, nhưng' kiểm tra rake' thì không. Tôi đã sao chép nó đúng nguyên văn. Đây là liên kết đến nội dung tập tin của tôi: http://pastebin.com/FHMXU6vG Cảm ơn bạn trước! – robert

8

tôi đã tìm cách để làm điều tương tự nhưng với rspec & autospec và phải mất một chút đào để tìm ra chỉ là nơi họ đã nhận được danh sách các mẫu thư mục/tập tin đó quyết mà file test để chạy. Cuối cùng, tôi thấy điều này trong lib/nhiệm vụ/rspec.rake: 86

[:models, :controllers, :views, :helpers, :lib, :integration].each do |sub| 
    desc "Run the code examples in spec/#{sub}" 
    Spec::Rake::SpecTask.new(sub => spec_prereq) do |t| 
     t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""] 
     t.spec_files = FileList["spec/#{sub}/**/*_spec.rb"] 
    end 
    end 

tôi đã đặt thử nghiệm của tôi trong một thư mục đặc tả/libs mới khi tập tin rpsec.rake được cấu hình để tìm kiếm trong spec/lib. Đơn giản chỉ cần đổi tên libs -> lib đã làm các trick!

+0

Tôi có '/ lib' theo mặc định trong dự án của tôi bằng cách nào đó. Thật không may 'kiểm tra rake' không bắt kịp các tệp, vì vậy đây là chỉ RSpec và tôi phải sử dụng giải pháp ở trên. –

0

Để không xác định thêm tác vụ cào để chạy thử nghiệm từ thư mục được xác định tùy chỉnh, bạn cũng có thể chạy chúng bằng lệnh rake test:all. Cấu trúc thư mục thử nghiệm cho thư mục lib hoặc bất kỳ thư mục tùy chỉnh nào khác tùy thuộc vào bạn. Nhưng tôi muốn sao chép chúng trong các lớp học: lib phù hợp với test/lib, app/form_objects đến test/form_objects.

3

Cách dễ dàng và gọn gàng chỉ là tạo thư mục theo thử nghiệm/đơn vị/lib. Sau đó, tạo thử nghiệm dưới dạng test/unit/lib/foo_test.rb tương ứng với lib/foo.rb. Không yêu cầu công việc cào mới và bạn có thể lồng thêm nhiều thư mục nếu cần để phù hợp với cấu trúc thư mục lib.

-2

Sử dụng:

[spring] rake test:all 

để chạy tất cả các xét nghiệm, bao gồm cả các thư mục mà bạn đã tạo (như [root]/test/lib/).

Bỏ qua [spring] nếu bạn không sử dụng.

+0

bị hủy bỏ! Không biết cách xây dựng kiểm tra nhiệm vụ: tất cả ' – Intentss

3

Tính đến Rails 4.0:

rake test:all   # Run all tests in any subdir of `test` without resetting the DB 
rake test:all:db  # Same as above and resets the DB 

Tính đến Rails 4.1, xác định lại test:run để bao gồm các nhiệm vụ bổ sung khi chạy rake hoặc rake test:

# lib/tasks/test.rake 

namespace :test do 
    Rake::Task["run"].clear 
    task run: ["test:units", "test:functionals", "test:generators", "test:integration", "test:tasks"] 

    ["tasks"].each do |name| 
    Rails::TestTask.new(name => "test:prepare") do |t| 
     t.pattern = "test/#{name}/**/*_test.rb" 
    end 
    end 
end 

này có thêm tiền thưởng xác định rake test:tasks trong ví dụ cho .

Kể từ Rails 4.2, test:run bao gồm tất cả các subdirs test bao gồm cả các số này khi chạy rake test và do đó rake.

+0

Trong Rails 5, các tác vụ khác nhau này không còn tồn tại. – Qqwy

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