2009-08-10 38 views

Trả lời

16

Nhiệm vụ của Rake khá khó kiểm tra. Giải pháp đơn giản nhất là chuyển logic thành một phương thức trong một mô hình thích hợp. Sau đó bạn có thể kiểm tra và chỉ cần gọi phương thức từ nhiệm vụ rake.

+0

tôi nghĩ rằng đây là một gợi ý khá, nhưng nó không trả lời câu hỏi. Bạn không cần phải gây ô nhiễm cho các mô hình của mình để chạy tập lệnh batch, v.v. trên dữ liệu của bạn. –

+0

Tôi có một câu trả lời hay hơn ở đây: http://stackoverflow.com/a/926100/94120 –

3

này được khá tốt bao gồm trong another SO question

Tôi đề nghị, lặp đi lặp lại ở đây trong Tóm lại, không phải là để thử nhiệm vụ thử nghiệm cào: trích xuất mã được thử nghiệm để một lớp học, mô hình hay chức năng lib và thử nghiệm nó ở đó. Sau đó, chỉ cần sử dụng cào để gọi các chức năng và quản lý các phụ thuộc.

17

Cái gì như:

def execute_rake(file,task) 
    require 'rake' 
    rake = Rake::Application.new 
    Rake.application = rake 
    Rake::Task.define_task(:environment) 
    load "#{Rails.root}/lib/tasks/#{file}" 
    rake[task].invoke 
    end 

Tại spec của bạn:

execute_rake("tags.rake","tags:popular") 
+1

cào [nhiệm vụ] .invoke thay vì cào [thẻ] .invoke – standup75

+0

câu trả lời tuyệt vời. Đó là điều tải đã làm các trick khi thử nghiệm rake nhiệm vụ cho một viên ngọc. –

+0

Đây là một ý tưởng tồi. Công việc này, cho đến khi bạn cần sử dụng cào để chạy thử nghiệm của bạn. Trong trường hợp đó, các thử nghiệm của bạn sẽ không hoạt động âm thầm với mã thoát khác 0, nhưng rspec sẽ báo cáo tất cả các kiểm tra vượt qua. –

1

Tôi thích PivotalLabs' way nhất. Tuy nhiên, tôi khái quát hóa và sửa đổi mã của họ như sau trong ứng dụng của tôi:

# file: spec/tasks/my_rake_file_spec.rb 
require 'spec_helper' 
require 'rake' 

describe 'my_rake_file.rake' do 
    before :all do 
    Rake.application.rake_require 'tasks/my_rake_file' 
    Rake::Task.define_task(:environment) 
    end 

    let(:run_rake_task) { 
    Rake::Task[task_name].reenable 
    Rake.application.invoke_task task_name 
    } 

    describe 'my_task_name' do 
    let(:task_name) { "my_task_name" } 

    it "creates 10 cars" do 
     run_rake_task 
     Car.count.should == 10 
    end 
    end 
end 

Ngoài ra, tôi trích việc nặng nhọc mã my_rake_file.rake của một mô-đun, được lưu trữ trong thư mục lib/

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