2011-10-31 7 views
6

estoy usando este bloque de código para imitar la forma de cargar los archivos:RSpec convertir los parámetros POST a cadena? (Archivo de la prueba de subida)

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 

En la prueba rspec se POST'd al controlador:

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

Pero se rompe esta línea en el controlador real:

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

Debido params [: Registrar] [: archivo] está siendo interpretted como una cadena en lugar de un objeto ActionDispatch:

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

¿Es este comportamiento estándar para rspec? ¿Hay alguna manera de pasar objetos a través de params?

+0

entonces ... ¿lo conseguiste trabajando? ¿Me ayudó mi respuesta? –

Respuesta

2

No es RSpec que convierte tus objetos param a cadenas, es Rails 3.1.

Puede solucionarlo utilizando fixture_file_upload como se describe en this answer.

0

Es posible que necesite usar esto: ActionController :: TestUploadedFile lugar de un archivo ActionDispatch real

Ver esta otra pregunta S/S para un ejemplo de uso: How do I test a file upload in rails?

Aunque éste se sugiere puede utilizar lo que tienes: test a file upload using rspec - rails

considera también podría ser algo raro con rspec no tratar el sistema: registrarse => {: file => bla} º e igual que: register => {'file' => blah}

Cuestiones relacionadas