ruby-on-rails - imagenes - storage rails
prueba unitaria en rieles-modelo con clip (3)
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?
Agregar un archivo a un modelo es completamente 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, debe colocar el archivo en su directorio de test/fixtures
.
Normalmente hago un pequeño ayudante 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 utilizas algo como Factory Girl en lugar de accesorios, esto se vuelve aún más fácil.
Esto está en Rspec, pero puede cambiarse 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
Como Paperclip está bastante 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 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 extras se pueden encontrar en Model.attachment_definitions
.
Yo 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
entonces
# in spec
before(:each) { @user = FactoryGirl.create(:user, :with_photo) }
En el archivo adjunto del clip especifique dónde se va a guardar, 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 pruebe tanto la definición_de_aplicación (como lo sugirió kwon) como el Dir.glob para verificar que el archivo esté guardado
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 de que está llevando a cabo la dirección / camino correcto, etc.