Question

Je suis en train d'écrire un test pour un modèle avec une image, en utilisant paperclip. J'utilise la valeur par défaut framework de test, pas Shoulda ou rspec. Dans ce contexte, comment dois-je tester? Dois-je vraiment télécharger un fichier? Comment dois-je ajouter un fichier à l'appareil?

Était-ce utile?

La solution

Ajout du fichier à un modèle est simple mort. Par exemple:

@post = Post.new
@post.attachment = File.new("test/fixtures/sample_file.png")
# Replace attachment= with the name of your paperclip attachment

Dans ce cas, vous devez placer le fichier dans votre test/fixtures dir.

Je fais habituellement un petit assistant dans mon test_helper.rb

def sample_file(filename = "sample_file.png")
  File.new("test/fixtures/#{filename}")
end

Ensuite

@post.attachment = sample_file("filename.txt")

Si vous utilisez quelque chose comme Factory Girl au lieu de fixtures cela devient encore plus facile.

Autres conseils

Ceci est en Rspec, mais peut être facilement commuté

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

Depuis Paperclip est assez bien testé, je ne me concentre généralement pas trop sur l'acte de « ajout », à moins que je fais quelque chose hors de l'ordinaire. Mais je vais essayer de se concentrer davantage sur faire en sorte que les configurations de la pièce jointe, par rapport au modèle, il appartient, répondre à mes besoins.

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

Tous les goodies peuvent être trouvés dans Model.attachment_definitions.

J'utilise factorygirl, la configuration du modèle.

#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

puis

 # in spec

before(:each) { @user = FactoryGirl.create(:user, :with_photo) }

Dans la pièce jointe paperclip préciser où il va être sauvé à savoir

...
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

...

puis testez les deux attachment_definitions (comme suggéré par Kwon) et le Dir.glob pour vérifier le fichier est enregistré

 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 cette façon je suis sûr que la réalisation de la bonne directy / path créer etc

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top