2011-02-09 12 views
11

Estoy utilizando Paperclip y S3 para la carga de imágenes y estoy tratando de colgar llamadas a S3 desde mi suite de pruebas. He encontrado el puesto thoughtbot que menciona haciendoStubbing Paperclip solicitudes S3 en las especificaciones

a.cover  { a.paperclip_fixture('album', 'cover', 'png') } 

pero eso me da un "número incorrecto de argumentos (4 a 2)" error. Traté de cambiar los argumentos anteriores a una matriz, que elimina el error original, pero da un error que dice "Atributo ya definido: paperclip_fixture".

¿Alguien ha podido hacer que esto funcione? Además, idealmente me gustaría utilizar el sistema de archivos local para el entorno de desarrollo. ¿Hay una forma fácil de hacer esto?

+0

Podría publicar más información sobre el código por favor? Por ejemplo, ¿qué es a.cover? Supongo que a es su objeto, y ¿cuál es el atributo que contiene el URI en la imagen? – hahuang65

+0

Además, ¿qué estás tratando de probar exactamente? Ayudaría tener más contexto aquí. – hahuang65

Respuesta

3

¿Estás usando shoulda? Si no está usando debería, el método paperclip_fix que está utilizando puede provenir de otro lugar y comportarse de manera diferente.

potencialmente relevantes: https://github.com/thoughtbot/paperclip/blob/master/shoulda_macros/paperclip.rb

+0

@Eric M. ¿Qué código agregaste para hacer que esto funcione? Estoy teniendo el mismo problema –

+0

@Eric M. @Eliza @ Peter Nixey ¿Hubo una solución directa a este problema? He intentado varias estrategias para incluir 'Paperclip :: Shoulda' en varias etapas sin suerte. ¿Alguna sugerencia de seguimiento? – sorens

+0

@sorens - no tengo idea de lo que estoy asustado. Pasé a este –

7

Está bien, tengo el problema básico calculado. Esto es (creo) como dijo Eliza, porque no estoy usando shoulda (estoy usando rspec 2.6.0 y factory_girl 2.1.2).

Esto es lo que funcionó para mí (donde Profile es la clase que tiene los archivos adjuntos):

Profile.any_instance.stub(:save_attached_files).and_return(true) 
    @profile = Factory(:profile) 

Por el momento sólo tengo este derecho en mi método de mi rspec ejemplo before. Probablemente haya un mejor lugar para ponerlo.

+3

no funciona con paperclipe 3 –

1

Así es como lo hice funcionar. Primero tienes que tener la gema fakeweb o fallará. También debe tener un archivo vacío en la ruta spec/support/paperclip/[model]/[attachment_name][ext].

Lo que hice fue copiar el código de Paperclip y pegarlo en mi fábrica. No pude hacer funcionar el 'paperclip_fixture'.

factory :attachment do 
    file do |a| 
    # Stubbed Paperclip attachment from: https://github.com/thoughtbot/paperclip/blob/master/shoulda_macros/paperclip.rb#L68 
    # FIX: This was the only way I made this work. Calling the paperclip_fixture directly didn't work. 
    # See: http://stackoverflow.com/questions/4941586/stubbing-paperclip-s3-requests-in-specs 
    model, attachment, extension = "customer_attachment", "file", "doc"  
    definition = model.gsub(" ", "_").classify.constantize. 
         attachment_definitions[attachment.to_sym] 

    path = "http://s3.amazonaws.com/:id/#{definition[:path]}" 
    path.gsub!(/:([^\/\.]+)/) do |match| 
     "([^\/\.]+)" 
    end 

    begin 
     FakeWeb.register_uri(:put, Regexp.new(path), :body => "OK") 
    rescue NameError 
     raise NameError, "the stub_paperclip_s3 shoulda macro requires the fakeweb gem." 
    end 
    base_path = File.join(Rails.root, "spec", "support", "paperclip") 
    File.new(File.join(base_path, model, "#{attachment}.#{extension}")) 
    end 
end 
1

Así es como corto un archivo desde un clip sin usar los auxiliares de hombro.

before(:each) do 
    @sheet = double('sheet') 
    @sheet.stub(:url).and_return(File.join(Rails.root, 'spec','fixtures','files', 'file.xls')) 
    active_record_object.stub(:sheet).and_return(@sheet) 
end 

Espero que esto ayude a alguien.

3

Muchas de estas técnicas no parecen funcionar con el último clip y S3. Lo que finalmente trabajado para mí es la combinación de:

AWS.config(:access_key_id => "TESTKEY", :secret_access_key => "TESTSECRET", :stub_requests => true) 

y

Mymodel.any_instance.stubs(:save_attached_files).returns(true) 

Pero, en realidad, lo único que tiene que hacer en muchos casos es la AWS: stub_requests y va a lograr lo que quiere .

+0

'AWS.stub!' También funciona. – Sidane

+0

Empecé con su idea, y luego, leyendo [la documentación de v2 para la clase 'Aws :: Client'] (http://docs.aws.amazon.com/sdkforruby/api/Aws/ClientStubs.html) decidió que esto funciona mejor: 'Aws.config = {stub_responses: true}' – sameers

1

Acabo de encontrar esta actualización de una aplicación de Rails 2.3 a Rails 3.0 después de haber seguido Testing Paperclip on S3 with Cucumber & Factory Girl.

En lugar de incluir el módulo Paperclip :: Shoulda en la clase de fábrica, he tenido que incluir en la clase factorygirl :: DefinitionProxy, así que cambié esto:

class Factory 
    include Paperclip::Shoulda 
end 

a

class FactoryGirl::DefinitionProxy 
    include Paperclip::Shoulda 
end 

Como referencia, estoy usando paperclip 2.4.1 y factory_girl 2.0.5.

5

Colocar esto en mi archivo 'spec/rails_helper.rb' trabajó para mí:

require 'aws' 
AWS.stub! 
AWS.config(:access_key_id => "TESTKEY", :secret_access_key => "TESTSECRET") 
+0

Esa debería ser la respuesta aceptada, ¡gracias! – amrdruid

3

Con la última clip (de github rama principal) y AWS-SDK versión 2, he resuelto mi problema con la configuración siguiente :

require "aws-sdk" 
Aws.config[:s3] = {stub_responses: true} 

Para obtener más información, por favor, eche un vistazo a amazon sdk

Cuestiones relacionadas