RSpec将POST参数转换为字符串? (测试文件上传器)

时间:2011-10-31 18:11:35

标签: ruby-on-rails rspec rspec-rails

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

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的标准行为吗?有没有办法通过参数传递对象?

2 个答案:

答案 0 :(得分:2)

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

您可以使用this answer中描述的fixture_file_upload来解决问题。

答案 1 :(得分:0)

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

有关使用示例,请参阅此其他S / O问题: How do I test a file upload in rails?

虽然这个建议你可以使用你得到的东西: test a file upload using rspec - rails

另外考虑一下rspec可能不适合处理:register =&gt; {:file =&gt; blah}与:register =&gt;相同{'file'=&gt;嗒嗒}