मैं एक पेपरक्लिप अटैचमेंट बनाने के लिए फैक्ट्री गर्ल का उपयोग कैसे करूं?


119

मेरे पास मॉडल व्यक्ति है जिसमें कई छवियां हैं, जहां छवियों में एक पेपरक्लिप अनुलग्नक फ़ील्ड है जिसे डेटा कहा जाता है, एक संक्षिप्त संस्करण नीचे प्रदर्शित किया गया है:

class Person
  has_many :images
  ...
end

class Image
  has_attached_file :data
  belongs_to :person
  ...
end

व्यक्ति को कम से कम एक छवि संलग्न करना आवश्यक है।

FactoryGirl का उपयोग करते समय, मेरे पास निम्नलिखित के समान कोड है:

Factory.define :image do |a|
  a.data { File.new(File.join(Rails.root, 'features', 'support', 'file.png')) }
  a.association :person
end

Factory.define :person do |p|
  p.first_name 'Keyzer'
  p.last_name 'Soze'
  p.after_create do |person|
    person.assets = [Factory.build(:image, :person => person)]
  end
  # p.images {|images| [images.association(:image)]}
end

(एनबी मैंने भी कोशिश की है कि ऊपर टिप्पणी की गई कोड को भी आज़माया गया था) जब मैं ककड़ी सुविधाएँ चलाता हूं, तो अधिकांश समय मुझे एक त्रुटि मिलती है:

ऐसी कोई फ़ाइल या निर्देशिका - /tmp/stream,9887,0.png (Errno :: ENOENT)

...

कभी-कभी परीक्षण सफलतापूर्वक चलते हैं।

क्या कोई मुझे बता सकता है कि मुझे यहाँ क्या समस्या है या वे कैसे एक साथ कुछ हासिल करने के लिए FactoryGirl और Paperclip का उपयोग करते हैं जैसे मैं क्या हासिल करने की कोशिश कर रहा हूं?

मैं रेल 3 का उपयोग कर रहा हूं।


2
जैसे ही आप नाम का परीक्षण करते हैं, तो Keyzer Soze का उपयोग करने के लिए प्रश्न पर वोट दें!
ब्रेनो

जब मैं ऐसा करता हूं ... तस्वीरें सार्वजनिक हो जाती हैं और मुझे सार्वजनिक / सिस्टम फ़ोल्डर में रखा जाता है, जब मैं परीक्षण सूट चलाता हूं। टेस्ट सूट चलने के बाद तस्वीरें नष्ट नहीं होती हैं। किसी और को यह नोटिस करता है?
Jwan622

जवाबों:


86

आप fixture_file_upload का उपयोग कर सकते हैं

include ActionDispatch::TestProcess आपके परीक्षण सहायक में, यहाँ एक उदाहरण कारखाना है:

include ActionDispatch::TestProcess

FactoryBot.define do
  factory :user do
    avatar { fixture_file_upload(Rails.root.join('spec', 'photos', 'test.png'), 'image/png') }
  end
end

उपरोक्त उदाहरणों में, spec/photos/test.pngआपके परीक्षण चलाने से पहले आपके आवेदन की मूल निर्देशिका में मौजूद होना चाहिए।

ध्यान दें, FactoryBotयह एक नया नाम है FactoryGirl


2
यह उत्तर पूरी तरह से सही है, लेकिन यह कहने के लिए अधिक स्पष्ट हो सकता है कि टेस्टप्रोसेस में कारखाने के साथ शामिल होने की आवश्यकता है और न केवल आपके spec_helper में।
एंड्रयू हब्स

2
स्पष्टीकरण के लिए धन्यवाद, एंड्रयू। आपको FactoryGirl.define ब्लॉक से पहले "ActionDispatch :: TestProcess" को शामिल करना पड़ सकता है (जो इस gist में नहीं होता है: gist.github.com/313121 )।
सैम

3
इसके अलावा, { }आवश्यक हैं। यह इसके बिना टूट जाता है
बिग पोटेटो

3
आगे स्पष्टीकरण: include ActionDispatch::TestProcess, कारखाने फ़ाइल के शीर्ष पर डाला जाना चाहिए बाहरFactoryGirl.define do...end ब्लॉक।
फ्रैंक कोहल

49

नया FG सिंटैक्स और कोई आवश्यक शामिल नहीं है

factory :user do
  avatar { File.new(Rails.root.join('app', 'assets', 'images', 'rails.png')) }
end

या, अभी तक बेहतर,

factory :user do
  avatar { File.new("#{Rails.root}/spec/support/fixtures/image.jpg") } 
end

2
मुझे यह पसंद है, लेकिन ध्यान रखें कि रेल 4 एप्लिकेशन / परिसंपत्तियों / छवियों / रेलगाड़ियों को हटा देती है। इसलिए, आपको उस परिवर्तन को ध्यान में रखना होगा :)
stephenmurdoch

38

Pivotal लैब्स में डेसमंड बोवे ने स्मृति रिसाव की समस्याओं के कारण fix__ile_upload से बचने का सुझाव दिया । इसके बजाय, आपको अपने कारखाने में सीधे कागज़ के खेतों को सेट करना चाहिए:

factory :attachment do
  supporting_documentation_file_name { 'test.pdf' }
  supporting_documentation_content_type { 'application/pdf' }
  supporting_documentation_file_size { 1024 }
  # ...
end

मेरे लिये कार्य करता है। युक्ति / परीक्षण फ़ोल्डर में मौजूदा फ़ाइल की आवश्यकता नहीं होने के लिए भी पर्याप्त सरल है।
bibstha

2
मेमोरी लीक से बचने के अलावा, इस तरह से परीक्षण तेज होंगे।
21

उल्लिखित ब्लॉग पोस्ट pivotal.io/blog
Karsten S.

दुर्भाग्य से यह अनुलग्नक सत्यापन के साथ काम नहीं करता है content_type। उसके लिए आपको एक मान्य फ़ाइल ऑब्जेक्ट की आवश्यकता है।
कर्स्टन एस।

25

मैं नीचे दिए गए कोड में कोड का उपयोग कर रहा हूं:

रेलें २

http://gist.github.com/162881

रेल 3

https://gist.github.com/313121


1
बस उन्हीं बातों को सोचकर और यह खूबसूरती से काम करता है। धन्यवाद। मैंने इसे इनिशियलाइज़र में डाला।
टोड

1
नोट करने के लिए कुछ: ऊपर दिए गए बड़े पुराने FactoryGirl सिंटैक्स का उपयोग करता है। दान जवाब नए वाक्यविन्यास का उपयोग करता है।
एंड्रयू ह्यूब्स


4

ActionController :: TestUploadedFile का उपयोग करने का प्रयास करें। आप केवल फ़ाइल संपत्ति को TestUploadedFile के उदाहरण पर सेट कर सकते हैं और पेपरक्लिप को बाकी का ध्यान रखना चाहिए। उदाहरण के लिए

valid_file = File.new(File.join(Rails.root, 'features', 'support', 'file.png'))  
p.images { 
   [
     ActionController::TestUploadedFile.new(valid_file, Mime::Type.new('application/png'))
   ] 
}

0

कुछ मामलों में उपरोक्त उत्तर मदद कर सकते हैं, और वास्तव में मेरी स्थितियों में से एक में मदद मिली है, लेकिन एक कैरियरवे का उपयोग करते समय, इस सवाल से पिछले समाधान ने इस बार काम नहीं किया।

पहले दृष्टिकोण:

मेरे after :createलिए मेरे लिए इस तरह से एक हल की समस्या को जोड़ना :

after :create do |b|
  b.update_column(:video_file, File.join(Rails.root, 'spec', 'fixtures', 'sample.mp4'))
end

इनलाइन वीडियो फ़ाइल सेट करना जैसे video_file { File.new("#{Rails.root}/spec/fixtures/sample.mp4") }काम नहीं किया और यह त्रुटियों की रिपोर्ट कर रहा था।

दूसरा चरण:

इस तरह एक कारखाने को परिभाषित करें ( personal_fileअपने अनुलग्नक नाम में परिवर्तन ):

FactoryGirl.define do
  factory :contact do
    personal_file { File.new("#{Rails.root}/spec/fixtures/personal_files/my_test_file.csv") }
    personal_file_content_type 'text/csv'

  end
end

और इन पंक्तियों को इसमें जोड़ें config/environemnts/test.rb:

config.paperclip_defaults = {
  url: "#{Rails.root}/spec/fixtures/:attachment/:filename",
  use_timestamp: false
}

-1

आप वास्तव में क्या परीक्षण कर रहे हैं? वह पेपरक्लिप सफलतापूर्वक फ़ाइल संलग्न करेगा? यह वास्तव में एक परीक्षण की तरह लगता है कि पेपरक्लिप को संभालना चाहिए, न कि आपके आवेदन को।

आपने कोशिश की है

a.data { File.join(Rails.root, 'features', 'support', 'file.png') }

हम factory_girl के बजाय Machinist का उपयोग करते हैं और बस जैसी चीजों का उपयोग करते हैं

Image.blueprint do
  image { RAILS_ROOT + 'spec/fixtures/images/001.jpg' }
end

हालांकि, जब हम ऐसा करते हैं तो हम वास्तव में बहुत परीक्षण नहीं कर रहे हैं, हम आम तौर पर केवल एक वैध Imageवस्तु चाहते हैं।


मेरे पास ऐसे मॉडल हैं जिनके लिए एक पेपरली-सक्षम मॉडल के साथ एक वैध जुड़ाव के साथ एक वैध जुड़ाव की आवश्यकता होती है।
एरिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.