2017-10-20 41 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'也有帮助 –