8

我正在使用这段代码来模仿文件上传的方式:

def mock_file
  file = File.new((Rails.root + "public/checklist_items_template.csv"),"r")
  image = ActionDispatch::Http::UploadedFile.new(
          :filename => "checklist_items_template.csv", 
          :type => "text/csv", 
          :head => "Content-Disposition: form-data;
                    name=\"checklist_items_template.csv\"; 
                    filename=\"checklist_items_template.csv\" 
                    Content-Type: text/csv\r\n",
          :tempfile => file)
  return image
end

在 rspec 测试中,它被 POST 到控制器:

post :create, :legal_register_id => "1", :register => {"file" => mock_file}

但它在实际控制器中打破了这一行:

CSV.parse(params[:register][:file].read.force_encoding('UTF-8'))

因为 params[:register][:file] 被解释为字符串而不是 actiondispatch 对象:

undefined method `read' for "#<ActionDispatch::Http::UploadedFile:0x00000108de3da8>":String

这是 rspec 的标准行为吗?有没有办法通过参数传递对象?

4

2 回答 2

2

将参数对象转换为字符串的不是 RSpec,而是 Rails 3.1。

您可以fixture_file_upload按照此答案中的说明使用来解决它。

于 2012-04-11T04:22:34.793 回答
0

您可能需要使用这个: ActionController::TestUploadedFile 而不是实际的 ActionDispatch 文件

有关使用示例,请参阅其他 S/O 问题: 如何在 rails 中测试文件上传?

虽然这个建议你可以使用你所拥有的: test a file upload using rspec - rails

还要考虑它可能是 rspec 不处理 :register => {:file =>blah} 与 :register => {'file' => blah} 相同的东西

于 2011-11-03T18:47:55.847 回答