2011-08-01 32 views
47

Tôi đang xây dựng một bộ thử nghiệm tích hợp và có một chút logic mà tôi cần phải có một cơ sở dữ liệu sạch. Làm cách nào để chạy tác vụ db:test:purge bên trong một trong các thử nghiệm của tôi?Chạy các nhiệm vụ Rake trong các thử nghiệm Rspec

Tôi đang sử dụng: ruby ​​1.9.2, Rails 3.0.9, rspec 2,6

+0

cùng mà không RSpec: http://stackoverflow.com/questions/3530/how-do-i-rake-tasks-within -a-ruby-script –

Trả lời

51

Bạn có thể gọi các nhiệm vụ Rake như sau:

require 'rake' 
Rake::Task[name].invoke 

Trong trường hợp này này sẽ cho kết quả trong đoạn mã sau:

require 'rake' 
Rake::Task['db:test:purge'].invoke 
+0

Điều đó đã làm được. Cảm ơn. Tôi cũng đã có tên của nhiệm vụ sai, mà đã ném tôi ra lúc đầu tiên. Trong Rails 3, kiểm tra rake: chuẩn bị dường như làm thủ thuật – xentek

+1

@jim điểm tốt. bạn có thể sử dụng Rake::Task[name].execute trong những trường hợp đó, nhưng bạn sẽ cần phải đảm bảo rằng bạn đáp ứng bất kỳ phụ thuộc nào của nó (ví dụ: ': environment') vì những trường hợp đó không chạy khi gọi nhiệm vụ bằng phương pháp này. – xentek

+0

Điều này hữu ích. Làm thế nào để chuyển một tham số vào nhiệm vụ đưa ra các ví dụ trên? – n8gard

32

câu trả lời chấp thuận không làm việc cho tôi, khi tôi cần thiết để thực hiện nhiệm vụ cào của riêng tôi

Đây là giải pháp của tôi

Đặt ở phía trên cùng của file spec

require 'rake' 

Nơi những dòng này khi bạn cần phải thực hiện nhiệm vụ cào tùy chỉnh của bạn, ví dụ cào update_data từ tập tin example.rake

load File.expand_path("../../../lib/tasks/example.rake", __FILE__) 
# make sure you set correct relative path 
Rake::Task.define_task(:environment) 
Rake::Task["update_data"].invoke 

môi trường của tôi:

rails (4.0.0) 
ruby (2.0.0p195) 
rspec-core (2.14.7) 
rspec-expectations (2.14.3) 
rspec-mocks (2.14.4) 
rspec (2.14.1) 
rspec-rails (2.14.0) 
+1

Hii, thay vào đó tôi đã sử dụng _Rails.application.load_tasks_, dưới đây yêu cầu 'rake'. Đây có phải là giải pháp tốt không? – coderVishal

+0

'Rake :: Task.define_task (: môi trường)' để giành chiến thắng trong việc tránh 'RuntimeError: Không biết cách xây dựng môi trường nhiệm vụ '(xem --tasks)' – s2t2

+3

Tôi đang sử dụng: 'Rake.application. rake_require "tasks/task-name" 'để tải nhiệm vụ cụ thể đang được thử nghiệm, thay vì tải tất cả chúng bằng' Rails.application. load_tasks' (Rails 5, Rspec 3.5) – Steve

9

Nếu chúng tôi yêu cầu phải sử dụng nhiều nhiệm vụ cào chúng ta có thể thêm

require "rake" 
Rails.application.load_tasks 

Sau đó, chỉ cần gọi bất kỳ nhiệm vụ nào.

Rake::Task['sync:process_companies'].invoke 

Mặc dù tôi không thể xác nhận nếu nó chậm hơn vì nó tải tất cả các nhiệm vụ

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