2017-10-20 7 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(必要に応じてサブフォルダ内)に配置します。例えば、何かのように:あなたのspec

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

、あなたはその後、いくつかのProject(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'も役立ちます –

関連する問題