পেপারক্লিপ সংযুক্তি তৈরি করতে আমি কীভাবে কারখানার গার্ল ব্যবহার করব?


119

আমার কাছে এমন এক মডেল ব্যক্তি রয়েছে যার অনেকগুলি চিত্র রয়েছে, যেখানে চিত্রগুলিতে ডেটা নামক একটি পেপারক্লিপ সংযুক্তি ক্ষেত্র রয়েছে, এটি সংক্ষিপ্ত সংস্করণ নীচে প্রদর্শিত হয়েছে:

class Person
  has_many :images
  ...
end

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

ব্যক্তির সাথে কমপক্ষে একটি চিত্র যুক্ত থাকা প্রয়োজন attached

ফ্যাক্টরিগার্ল ব্যবহার করার সময়, আমার কাছে নিম্নলিখিতগুলির মতো কোড রয়েছে:

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 (এর্ননো :: ENOENT)

...

কখনও কখনও পরীক্ষাগুলি সফলভাবে চলতে থাকে।

কেউ কি আমাকে বলতে পারে যে আমার এখানে কী সমস্যা হচ্ছে বা আমি কী অর্জন করার চেষ্টা করছি তার মতো কিছু অর্জন করতে তারা কীভাবে ফ্যাক্টরিগার্ল এবং পেপারক্লিপ ব্যবহার করে?

আমি রেল 3 ব্যবহার করছি।


2
আপনার নাম পরীক্ষা করার সাথে সাথে কেজার সোজে ব্যবহার করার জন্য প্রশ্নের উপরে ভোট দিন!
ব্রেনো

আমি যখন এটি করি ... ফটোগুলি উত্পন্ন হয় এবং সর্বদা আমি পরীক্ষার স্যুটটি চালানোর সময় সর্বজনীন / সিস্টেম ফোল্ডারে রাখি। পরীক্ষার স্যুটটি চালানোর পরে ছবিগুলি ধ্বংস হয় না destroyed অন্য কেউ এই বিজ্ঞপ্তি না?
Jwan622

উত্তর:


86

আপনি ফিক্সচার_ফাইল_আপলোড ব্যবহার করতে পারেন

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
এই উত্তরটি পুরোপুরি সঠিক, তবে এটি আরও স্পষ্ট করে বলা যেতে পারে যে টেস্টপ্রসেসটি কারখানার সাথে অন্তর্ভুক্ত করা দরকার এবং কেবল আপনার স্পেসিহেল্পারে নয়।
অ্যান্ড্রু হাবস

2
স্পষ্টির জন্য ধন্যবাদ, অ্যান্ড্রু। ফ্যাক্টরিগার্ল.ডেফাইন ব্লকের আগে আপনাকে "অ্যাকশনডিস্পাচ :: টেস্টপ্রসেস অন্তর্ভুক্ত করতে" থাকতে হবে (যা এই টুকরোতে ঘটে না: gist.github.com/313121 )।
স্যাম

3
এছাড়াও, { }প্রয়োজন হয়। এটি ছাড়াই এটি ব্রেক হয়
বড়পোটাটো

3
আরও স্পষ্টতা: ব্লকটির বাইরেinclude ActionDispatch::TestProcess কারখানা ফাইলের একেবারে শীর্ষে the োকানো উচিত। FactoryGirl.define do...end
ফ্র্যাঙ্ক কোহল

49

আরও নতুন এফজি সিনট্যাক্স এবং এতে কোনও প্রয়োজনীয় নেই includes

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 অ্যাপ / সম্পদ / চিত্র / Rails.png অপসারণ করে, তাই আপনাকে সেই পরিবর্তনের জন্য অ্যাকাউন্ট করতে হবে :)
স্টেফেনমুরডোচ

38

পাইভোটাল ল্যাবসে ডেসমন্ড বোয়ে মেমরি ফাঁস সমস্যার কারণে ফিক্সচার_ফाइल_আপলোড এড়ানো পরামর্শ দেয় । পরিবর্তে, আপনার সরাসরি কারখানায় পেপার ক্লিপ ক্ষেত্রগুলি সেট করা উচিত:

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

আমার জন্য কাজ কর. স্পেক / টেস্ট ফোল্ডারে কোনও বিদ্যমান ফাইলের প্রয়োজন না হওয়ার পক্ষে যথেষ্ট সহজ।
বিবস্থ

2
মেমরি ফাঁস এড়ানো ছাড়াও, এইভাবে পরীক্ষাগুলি আরও দ্রুত হবে।
এভেডোভেলি

উল্লিখিত ব্লগ পোস্টটি পাইভোটাল.আইও
কার্স্টেন এস

দুর্ভাগ্যক্রমে এটি সংযুক্তি যাচাইকরণের সাথে কাজ করে না content_type। তার জন্য আপনার একটি বৈধ ফাইল অবজেক্ট দরকার।
কার্স্টেন এস

25

আমি নীচের টুকরোটিতে কোডটি ব্যবহার করছি:

রেল 2

http://gist.github.com/162881

রেল 3

https://gist.github.com/313121


1
কেবল একই জিনিসগুলি নিয়ে ভাবছি এবং এটি সুন্দরভাবে কাজ করে। ধন্যবাদ। আমি এটি একটি ইনিশিয়ালাইজারে রেখেছি।
টড

1
কিছু লক্ষণীয়: উপরের সংক্ষেপে পুরানো ফ্যাক্টরিগারল সিনট্যাক্স ব্যবহার করা হয়েছে। ড্যানএস উত্তরটি নতুন সিনট্যাক্স ব্যবহার করে।
অ্যান্ড্রু হাবস


4

অ্যাকশনকন্ট্রোলার :: টেস্টআপলোডড ফাইল ব্যবহার করে দেখুন। আপনি কেবল ফাইলের সম্পত্তিটি টেস্টআপলোডড ফাইলের একটি উদাহরণে সেট করতে পারেন এবং পেপারক্লিপটি বাকী যত্ন নেওয়া উচিত। উদাহরণ স্বরূপ

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') }

আমরা ফ্যাক্টরি_গার্লের পরিবর্তে মেশিনিস্ট ব্যবহার করি এবং স্রেফ এই জাতীয় জিনিস ব্যবহার করেছি

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

যদিও আমরা এটি করার সময় আমরা সত্যিকার অর্থে খুব বেশি পরীক্ষা করি না, আমরা সাধারণত একটি বৈধ Imageঅবজেক্ট রাখতে চাই।


আমার কাছে এমন মডেল রয়েছে যার একটি পেপারক্লিপ-সক্ষম মডেলটির সাথে বৈধ সংযুক্তি প্রয়োজন, এটি বৈধ সংযুক্তি সহ।
এরিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.