2017-10-20 69 views
0

我有一個實現從服務上傳csv的代碼。用於CSV上傳的Rspec

require 'csv' 

    class ActualCsvProjectUpdater 
     def self.import(file, project) 
     CSV.foreach(file.path, headers: true) do |row| 
      actual_billable_hours, actual_non_billable_hours, start_date = row['actual_billable_hours'], row['actual_non_billable_hours'], row['start_date'] 


      week = project.weeks.find_by(start_date: start_date) 

      if week.present? 
      week.update!(actual_billable_hours: row['actual_billable_hours'], actual_non_billable_hours: row['actual_non_billable_hours']) 
      end 
     end 
     end 
    end` 

我該如何編寫測試?

回答

3

我首先將夾具文件放置在./spec/fixtures/*.csv(如果需要,可能位於子文件夾中)。例如,像:

actual_billable_hours,actual_non_billable_hours,start_date 
12,4,2017-10-20 
6,7,2017-10-04 

在你spec,然後需要初始化一些Project(S)(S)和Week;然後用該夾具文件調用該方法。沿線的東西:

Rspec.describe 'ActualCsvProjectUpdater' do 
    describe '.import' do 
    let!(:project) { create :project, weeks: [week1, week2] } 
    let(:week1) { create :week, ... } 
    let(:week2) { create :week, ... } 
    let(:csv_file) { File.new(fixture_path + '/csv/project_billable_hours.csv') } 

    it 'updates week included in file' do 
     descibed_class.import(csv_file, project) 
     expect(week1.reload.actual_billable_hours).to eq 12 
     expect(week1.reload.actual_non_billable_hours).to eq 4 
    end 
    end 
end 

這當然只是一個準則。例如,我假定您正在使用factory_girl,但這不是必需條件。

希望這可以讓您朝着正確的方向 - 您還將從添加更多測試來覆蓋邊緣案例中受益。 (如果日期是將來?或者遙遠的過去?或者日期無效?或者結算時間是否定/空白/不是數字?如果csv文件包含錯誤的標題怎麼辦?如果文件爲巨大,並導致性能問題?添加測試應用程序需要考慮。)

+0

愛測試一些燈具。在課堂上,教師並不認爲任何人都可以讓測試套件在30秒內運行。我的裝備在2秒內完成。 'factory_girl'也有幫助 –