Pregunta

Estoy intentando escribir una prueba para un modelo con una imagen, usando un clip.Estoy usando el marco de prueba predeterminado, no debería ni rspec.En este contexto, ¿cómo debo probarlo?¿Realmente debería subir un archivo?¿Cómo debo agregar un archivo al dispositivo?

¿Fue útil?

Solución

Adición de archivos 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, usted debe poner el archivo en el directorio test/fixtures.

Normalmente suelo hacer 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.

Otros consejos

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

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

Dado que Paperclip está bastante bien probado, normalmente no me concentro demasiado en el acto de "cargar", a menos que esté haciendo algo fuera de lo común.Pero intentaré centrarme más en garantizar que las configuraciones del accesorio, en relación al 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

Todas las delicias se pueden encontrar en Model.attachment_definitions.

Yo uso factorygirl, la configuración del 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

entonces

 # in spec

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

En el archivo adjunto clip especifique donde va a ser guardada 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

...

a continuación, probar tanto los attachment_definitions (según lo sugerido por Kwon) y el Dir.glob para comprobar el archivo se guarda

 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top