tutorial rails imagenes active ruby-on-rails ruby unit-testing paperclip

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.