test unitaire dans des rails - modèle avec trombone
-
19-09-2019 - |
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?
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