2009-12-12 8 views
33

Estoy tratando de escribir una prueba para un modelo con una imagen, usando clip. Estoy usando el marco de prueba predeterminado, sin shoulda o rspec. En este contexto, ¿cómo debería probarlo? ¿Debo realmente subir un archivo? ¿Cómo debo agregar un archivo al accesorio?prueba de unidad en rieles - modelo con clip

Respuesta

68

Agregar archivo a un modelo es muy simple. Por ejemplo:

@post = Post.new 
@post.attachment = File.new("test/fixtures/sample_file.png") 
# Replace attachment= with the name of your paperclip attachment 

En ese caso se debe poner el archivo en su test/fixtures dir.

por lo general hacen un poco de ayuda en mi test_helper.rb

def sample_file(filename = "sample_file.png") 
    File.new("test/fixtures/#{filename}") 
end 

Entonces

@post.attachment = sample_file("filename.txt") 

Si utiliza algo así como Factory Girl en lugar de accesorios Esto se hace aún más fácil.

+0

Da: NoMethodError: indefinido método 'adjunto =' – CanCeylan

+2

@CanCeylan' attachment' es genérico, como 'foo' ; debe reemplazarlo con el nombre que utilizó cuando agregó un archivo adjunto Paperclip en su modelo. –

+0

@RicoJones gracias, se ha agregado una aclaración en la publicación. –

16

Esto está en Rspec, pero se puede cambiar fácilmente sobre

before do # setup 
    @file = File.new(File.join(RAILS_ROOT, "/spec/fixtures/paperclip", "photo.jpg"), 'rb') 
    @model = Model.create!(@valid_attributes.merge(:photo => @file)) 
end 

it "should receive photo_file_name from :photo" do # def .... || should .... 
    @model.photo_file_name.should == "photo.jpg" 
    # assert_equal "photo.jpg", @model.photo_file_name 
end 

Desde Paperclip está bastante bien probado, por lo general no se centran demasiado en el acto de "subir", a menos que estoy haciendo algo fuera de lo común. Pero intentaré centrarme más en garantizar que las configuraciones del archivo adjunto, en relación con el modelo al que pertenece, satisfagan mis necesidades.

it "should have an attachment :path of :rails_root/path/:basename.:extension" do 
    Model.attachment_definitions[:photo][:path].should == ":rails_root/path/:basename.:extension" 
    # assert_equal ":rails_root/path/:basename.:extension", Model.attachment_definitions[:photo][:path] 
end 

Todos los objetos valiosos se pueden encontrar en Model.attachment_definitions.

+0

¿Qué es @valid_attributes? – CanCeylan

+1

Es solo un hash de los atributos necesarios para crear el modelo, en mi caso de prueba. Es posible que no lo necesite para sus propias pruebas. – nowk

1

Uso FactoryGirl, configuro el modelo.

#photos.rb 
FactoryGirl.define do 
    factory :photo do 
    image File.new(File.join(Rails.root, 'spec', 'fixtures', 'files', 'testimg1.jpg')) 
    description "testimg1 description" 
    end # factory :photo 
end 

continuación

# in spec 

before(:each) { @user = FactoryGirl.create(:user, :with_photo) } 

En el archivo adjunto clip especifique dónde va a ser salvado es decir

... 
the_path= "/:user_id/:basename.:extension" 
if Rails.env.test? 
    the_path= ":rails_root/tmp/" + the_path 
end 
has_attached_file :image, :default_url => ActionController::Base.helpers.asset_path('missing.png'), 
:path => the_path, :url => ':s3_domain_url' 

Paperclip.interpolates :user_id do |attachment, style| 
    attachment.instance.user_id.to_s 
end 

...

luego probar tanto los attachment_definitions (como lo sugiere kwon) y se guarda el Dir.glob para verificar el archivo

it "saves in path of user.id/filename" do 
    expect(Dir.glob(File.join(Rails.root, 'tmp', @user.id.to_s, @user.photo.image.instance.image_file_name)).empty?).to be(false) 
end 

de esta manera Estoy seguro que es llevar a cabo la correcta directy/ruta crear etc