2011-10-31 40 views
6

我使用這個代碼塊來模仿文件上傳方式:RSpec將POST參數轉換爲字符串? (測試文件上傳)

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'd控制器:

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

但它打破這條線在實際控制:

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

由於PARAMS [:寄存器] [:文件]被interpretted作爲字符串而不是actiondispatch對象:

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

這是rspec的標準行爲嗎?有沒有辦法通過params傳遞對象?

+0

所以...你有沒有得到它的工作?我的回答有幫助嗎? –

回答

2

這不是RSpec將參數對象轉換爲字符串,它是Rails 3.1。

您可以使用fixture_file_upload來避開它,如this answer中所述。

0

您可能需要使用:ActionController的:: TestUploadedFile 而不是實際的ActionDispatch文件

的看到這個其他的S/O問題使用的例子: How do I test a file upload in rails?

雖然這個建議你可以使用你有什麼: test a file upload using rspec - rails

還要考慮它可能是躲閃使用RSpec不是治療:註冊=> {:文件=>等等}次同樣:register => {'file'=> blah}