unit test in rotaie - modello con graffetta
-
19-09-2019 - |
Domanda
Sto cercando di scrivere un test per un modello con una foto, utilizzando graffetta. Sto utilizzando il framework di test di default, non shoulda o RSpec. In questo contesto, come devo provarlo? Devo davvero caricare un file? Come devo aggiungere un file per la Lampada?
Soluzione
L'aggiunta di file a un modello è semplice morto. Ad esempio:
@post = Post.new
@post.attachment = File.new("test/fixtures/sample_file.png")
# Replace attachment= with the name of your paperclip attachment
In questo caso si dovrebbe mettere il file nel dir test/fixtures
.
Di solito io faccio un po 'di aiuto nella mia test_helper.rb
def sample_file(filename = "sample_file.png")
File.new("test/fixtures/#{filename}")
end
Poi
@post.attachment = sample_file("filename.txt")
Se si usa qualcosa come Factory Girl invece di infissi questo diventa ancora più facile.
Altri suggerimenti
Questo è in Rspec, ma può essere facilmente commutato
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
Dal Paperclip è abbastanza ben collaudato, io di solito non concentrarsi troppo sulla atto di "uploading", a meno che non sto facendo qualcosa di straordinario. Ma cercherò di concentrarsi maggiormente sulla necessità di garantire che le configurazioni del l'allegato, in relazione al modello appartiene, soddisfare le mie esigenze.
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
Tutte le chicche si possono trovare in Model.attachment_definitions
.
Io uso factorygirl, impostare il modello.
#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
poi
# in spec
before(:each) { @user = FactoryGirl.create(:user, :with_photo) }
In allegato graffetta specificare dove la sua intenzione di essere salvati vale a dire
...
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
...
quindi verificare sia le attachment_definitions (come suggerito da Kwon) e il Dir.glob per controllare il file viene salvato
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
questo modo sono sicuro che il suo svolgimento e la correttezza directy / percorso creare etc