1

我的项目中有 roo gem 并使用Roo::Excel.new(path). .xls现在我想为上传文件的方法编写一个规范测试。

我尝试创建一个文件:

@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 不是 Excel 文件”,位于“Roo::Excel.new(path)”行。

为什么?

4

2 回答 2

2

我知道这是一个有点老的话题,但我刚刚遇到了同样的问题。我猜问题是最终fixture_file_upload创建了一个实例,它与在开发或生产中使用应用程序时创建Rack::Test::UploadedFile的有点不同。ActionDispatch::Http::UploadedFile

无论如何,就我而言,如果我以这种方式使用它,问题就会消失:Roo::Spreadsheet.open file.path, extension: :xlsx而不是:Roo::Excelx.new file.path

对于简单的 .xls 也是如此。

于 2015-09-22T22:16:36.403 回答
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 测试通过此代码通过。

于 2017-04-05T21:27:30.823 回答