2013-05-27 69 views
0

我在我的項目中使用roo寶石和使用Roo::Excel.new(path)。現在我想爲上傳.xls文件的方法編寫一個spec測試。rspec與Excel文件

我嘗試創建一個文件:

@file_xls = [fixture_file_upload('/files/example.xls', 'application/vnd.ms-excel')] 

這種運作良好。

post :method, :files => @file_xls 

這是行不通的。我得到這個錯誤:

"/var/folders/wG/wG0fTE+uEMGRa8nEqor1tU+++TI/-Tmp-/file_xls.xls20130527-497-nsnxs is not an Excel file", on line "Roo::Excel.new(path)".

爲什麼?

+0

我有一種感覺,它看起來在點後面的文件擴展名,並認爲它不是一個excel文件,甚至沒有試圖打開它 –

+0

如果我從前端使用這個文件的形式都很好。 – mantgomery

回答

2

我知道這是一個老話題,但我剛剛遇到同樣的問題。我想問題是fixture_file_upload最後會創建一個Rack::Test::UploadedFile的實例,它與ActionDispatch::Http::UploadedFile有點不同,它是在開發或生產中使用該應用程序時創建的。

無論如何,在我的情況下,如果我這樣使用它,問題就會消失:Roo::Spreadsheet.open file.path, extension: :xlsx而不是:Roo::Excelx.new file.path

對於簡單的.xls也是如此。

0

我同意Péter Tóth - Toma的回答。

然而,因爲我有多種格式我想接受,我寫了這爲我的代碼:

def self.open_spreadsheet(file) 
 
    case File.extname(file.original_filename) 
 
     when ".csv" then open_format(file, ".csv") 
 
     when ".xls" then open_format(file, ".xls") 
 
     when ".xlsx" then open_format(file, ".xlsx") 
 
     else raise "Unknown file type: #{file}" 
 
    end 
 
    end 
 

 
    private 
 

 
    def self.open_format(file, extension) 
 
    Roo::Spreadsheet.open(file.path, extension: extension) 
 
    end

我相信你可以把更多的「元」 - 但這代碼明確了我接受的格式。

希望這可以幫助別人。

RSpec測試通過此代碼。