prueba unitaria en rieles - modelo con clip
-
19-09-2019 - |
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?
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