2012-06-14 61 views
0

我在我的users_controller中有以下函數來從本地磁盤上傳csv文件並將其中的用戶詳細信息導出到我的應用程序中。代碼在應用程序中正常工作,但我不確定如何在測試中傳遞csv。我的功能如下:將CSV文件作爲參數傳遞給rspec

def upload 
    if request.post? 
    if (params[:user].nil? || params[:user][:csv].blank?) 
     flash[:notice] = "Please provide a csv file to upload."; return 
    end 

    file = params[:user][:csv].read 
    CSV.parse(file, headers: true, header_converters: :symbol).each { |row| Cortex::User.create(row.to_hash) } 

    respond_to do |format| 
     format.html { redirect_to admin_engine.cortex_users_path } 
     format.json { head :no_content } 
    end  
    else 
    # Provide upload view 
    end  
end 

這是我在試圖在RSpec的測試,來彌補這一嘗試。

it "should be a success" do 
    post "admin/users/upload", :user => @user, :user_csv => fixture_file_upload(Admin::Engine.root.join('spec/dummy/tenants_sample.csv')), :session_token => @auth_token 
    response.code.should eq("200") 
end 

當我使用coverage gem檢查LOC覆蓋範圍時,我可以看到測試在退出前輸入了前兩個if語句。

任何人都可以獲得關於如何傳遞該文件的任何提示,以便可以通過該函數的其餘部分讀取該文件。

乾杯

回答

2

恕我直言,測試CSV成分或解析時沒有在當前的測試屬於。最終,所有這樣的測試都會測試CSV模塊或CSV文件的有效性 - 這是一個脆弱的測試,並且幾乎不會告訴您有關您的應用程序。

更好的測試的做法是執行模型的測試,以確保:

  1. 一個正確格式的CSV導入你期望的方式。
  2. 格式錯誤的CSV文件適合您的應用程序處理。

控制器應該存根或模擬CSV解析,因爲它與響應代碼測試無關,而邏輯真的屬於模型。因人而異。