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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top