কারখানা গার্ল এবং আরএসপিকে কলব্যাকগুলি এড়িয়ে যান


103

আমি কলব্যাক তৈরির পরে এমন একটি মডেল পরীক্ষা করছি যা পরীক্ষার সময় আমি কেবল কয়েকটি অনুষ্ঠানে চালাতে চাই। আমি কীভাবে কোনও কারখানা থেকে কলব্যাকগুলি এড়িয়ে / চালাতে পারি?

class User < ActiveRecord::Base
  after_create :run_something
  ...
end

কারখানার:

FactoryGirl.define do
  factory :user do
    first_name "Luiz"
    last_name "Branco"
    ...
    # skip callback

    factory :with_run_something do
      # run callback
  end
end

উত্তর:


111

এটি সর্বোত্তম সমাধান কিনা তা আমি নিশ্চিত নই, তবে আমি সফলভাবে এটি ব্যবহার করে অর্জন করেছি:

FactoryGirl.define do
  factory :user do
    first_name "Luiz"
    last_name "Branco"
    #...

    after(:build) { |user| user.class.skip_callback(:create, :after, :run_something) }

    factory :user_with_run_something do
      after(:create) { |user| user.send(:run_something) }
    end
  end
end

কলব্যাক ছাড়াই চলছে:

FactoryGirl.create(:user)

কলব্যাক দিয়ে চলছে:

FactoryGirl.create(:user_with_run_something)

3
আপনি যদি কোনও :on => :createবৈধতা এড়াতে চান তবে ব্যবহার করুনafter(:build) { |user| user.class.skip_callback(:validate, :create, :after, :run_something) }
জেমস শেভালিয়ার

7
স্কিপিং কলব্যাক লজিকটি উল্টানো কি ভাল হবে না? আমার অর্থ, ডিফল্টটি এমন হওয়া উচিত যখন আমি কোনও বস্তু তৈরি করি তখন কলব্যাকগুলি ট্রিগার করা হয় এবং ব্যতিক্রমী ক্ষেত্রে আমার আলাদা পরামিতি ব্যবহার করা উচিত। সুতরাং ফ্যাক্টরিগার্ল.ক্রিয়েট (: ব্যবহারকারী) এর কলব্যাকগুলি ট্রিগারকারী ব্যবহারকারী তৈরি করা উচিত এবং ফ্যাক্টরিজর্ল.ক্রিয়েট (: ব্যবহারকারী_বিহীন_ক্যালব্যাকস) ব্যবহারকারীকে কলব্যাকগুলি ছাড়াই তৈরি করা উচিত। আমি জানি এটি কেবল একটি "ডিজাইন" পরিবর্তন, তবে আমি মনে করি এটি বিদ্যমান বিদ্যমান কোডটি ভাঙ্গতে এবং আরও ধারাবাহিক হতে এড়াতে পারে।
গাগনো

3
@ মিনিমালের সমাধান নোট হিসাবে, Class.skip_callbackকলটি অন্যান্য পরীক্ষাগুলিতে ক্রমাগত থাকবে, সুতরাং যদি আপনার অন্যান্য পরীক্ষাগুলি কলব্যাকের প্রত্যাশা করে, তবে আপনি যদি স্কিপিং কলব্যাক লজিকটি উল্টানোর চেষ্টা করেন তবে সে ব্যর্থ হবে।
এমপিডুঘের্টি

আমি after(:build)ব্লকের মোছার সাথে স্টাবিংয়ের বিষয়ে @ উবারল্লামের উত্তরটি ব্যবহার করে শেষ করেছি । এটি আপনার ফ্যাক্টরিটিকে কলব্যাক চালাতে ডিফল্ট করতে দেয় এবং প্রতিটি ব্যবহারের পরে কলব্যাক পুনরায় সেট করার প্রয়োজন হয় না।
এমপিডুঘের্টি

অন্যভাবে কাজ করার বিষয়ে আপনার কি কোনও ধারণা আছে? stackoverflow.com/questions/35950470/…
ক্রিস হাফ

89

আপনি যখন কলব্যাক চালাতে চান না তখন নিম্নলিখিতটি করুন:

User.skip_callback(:create, :after, :run_something)
Factory.create(:user)

সচেতন হোন যে স্কিপ_ক্যালব্যাক চালানোর পরে অন্যান্য চশমাগুলিতে দৃ across়তর থাকবে তাই নিম্নলিখিতগুলির মতো কিছু বিবেচনা করুন:

before do
  User.skip_callback(:create, :after, :run_something)
end

after do
  User.set_callback(:create, :after, :run_something)
end

12
আমি এই উত্তরটি আরও ভাল পছন্দ করি কারণ এটি স্পষ্টভাবে জানিয়েছে যে ক্লাস স্তরে কলিংব্যাকগুলি এড়ানো যায় এবং তাই পরবর্তী পরীক্ষাগুলিতে কলব্যাকগুলি এড়ানো অবিরত থাকবে।
siannopollo

আমি এটি আরও ভাল পছন্দ। আমি চাই না যে আমার কারখানা স্থায়ীভাবে অন্যরকম আচরণ করবে। আমি এটি পরীক্ষার একটি নির্দিষ্ট সেটের জন্য এড়িয়ে যেতে চাই।
TheUtherSide

39

এর সমাধানগুলির কোনওটিই ভাল নয়। তারা ক্লাস থেকে নয়, উদাহরণস্বরূপ অপসারণ করা উচিত কার্যকারিতা সরিয়ে ক্লাসকে কলুষিত করে।

factory :user do
  before(:create){|user| user.define_singleton_method(:send_welcome_email){}}

কলব্যাক দমন করার পরিবর্তে, আমি কলব্যাকের কার্যকারিতাটি দমন করছি। এক দিক থেকে, আমি এই পদ্ধতিরটি আরও ভাল পছন্দ করি কারণ এটি আরও স্পষ্ট।


1
আমি এই উত্তরটি সত্যিই পছন্দ করি, এবং অবাক হয়েছি যে এই জাতীয় কিছু, এলিয়াসড যাতে অবিলম্বে পরিষ্কার হয়, এটি নিজেই ফ্যাক্টরিগার্লের অংশ হওয়া উচিত।
জিউসেপ

আমি এই উত্তরটিও খুব পছন্দ করি আমি অন্য সমস্ত কিছুকে নীচে নামিয়ে দেব, তবে এটির কলব্যাকটি যদি around_*(যেমন user.define_singleton_method(:around_callback_method){|&b| b.call }) এর বংশধর হয় তবে আমাদের সংজ্ঞায়িত পদ্ধতিতে একটি ব্লক পাস করা দরকার বলে মনে হচ্ছে ।
Quv

1
কেবলমাত্র একটি ভাল সমাধান নয় তবে কিছু কারণে অন্য পদ্ধতিটি আমার পক্ষে কাজ করে নি। যখন আমি এটি বাস্তবায়ন করি তখন এটি বলে যে কোনও কলব্যাক পদ্ধতি বিদ্যমান নেই তবে আমি যখন এটি ছেড়ে দিই তখন এটি আমাকে অপ্রয়োজনীয় অনুরোধগুলিকে স্তব্ধ করতে বলবে। যদিও এটি আমাকে একটি সমাধানে নিয়ে যায়, কেউ কি জানেন যে কেন এমন হতে পারে?
Babbz77

27

অন্যান্য ব্যবহারকারী তৈরি করার সময় আফটার_সেভ কলব্যাককে আরও পুনরায় ব্যবহারযোগ্য করে তুলতে আমি @ লুইজব্র্যাঙ্কোর জবাবকে আরও উন্নত করতে চাই।

FactoryGirl.define do
  factory :user do
    first_name "Luiz"
    last_name "Branco"
    #...

    after(:build) { |user| 
      user.class.skip_callback(:create, 
                               :after, 
                               :run_something1,
                               :run_something2) 
    }

    trait :with_after_save_callback do
      after(:build) { |user| 
        user.class.set_callback(:create, 
                                :after, 
                                :run_something1,
                                :run_something2) 
      }
    end
  end
end

আফটার_সেভ কলব্যাক ছাড়াই চলছে:

FactoryGirl.create(:user)

আফটার_সেভ কলব্যাক দিয়ে চলছে:

FactoryGirl.create(:user, :with_after_save_callback)

আমার পরীক্ষায়, আমি ডিফল্টরূপে কলব্যাক ছাড়াই ব্যবহারকারী তৈরি করতে পছন্দ করি কারণ যে পদ্ধতিগুলি ব্যবহার করা হয় সেগুলি অতিরিক্ত স্টাফ চালায় যা আমি সাধারণত আমার পরীক্ষার উদাহরণগুলিতে চাই না।

---------- আপডেট ------------ আমি স্কিপ_ক্যালব্যাক ব্যবহার বন্ধ করে দিয়েছি কারণ পরীক্ষার স্যুটটিতে কিছু অসঙ্গতি সমস্যা ছিল।

বিকল্প সমাধান 1 (স্টাব এবং আনস্টাবের ব্যবহার):

after(:build) { |user| 
  user.class.any_instance.stub(:run_something1)
  user.class.any_instance.stub(:run_something2)
}

trait :with_after_save_callback do
  after(:build) { |user| 
    user.class.any_instance.unstub(:run_something1)
    user.class.any_instance.unstub(:run_something2)
  }
end

বিকল্প সমাধান 2 (আমার পছন্দসই পদ্ধতি):

after(:build) { |user| 
  class << user
    def run_something1; true; end
    def run_something2; true; end
  end
}

trait :with_after_save_callback do
  after(:build) { |user| 
    class << user
      def run_something1; super; end
      def run_something2; super; end
    end
  }
end

অন্যভাবে কাজ করার বিষয়ে আপনার কি কোনও ধারণা আছে? stackoverflow.com/questions/35950470/…
ক্রিস হাফ

বিকল্প সমাধান 2 এর জন্য রুবকপ "স্টাইল / সিঙ্গললাইন ম্যাথডস: একক-লাইন পদ্ধতির সংজ্ঞাগুলি এড়িয়ে চলুন" এর সাথে অভিযোগ করেছেন, সুতরাং আমাকে ফর্ম্যাটটি পরিবর্তন করতে হবে, তবে অন্যথায় এটি নিখুঁত!
কোবারলিন

14

5 রেল - skip_callbackফ্যাক্টরিবট কারখানা থেকে এড়িয়ে যাওয়ার সময় তর্ক ত্রুটি বাড়ানো।

ArgumentError: After commit callback :whatever_callback has not been defined

স্কিপ_ক্যালব্যাক কীভাবে অপরিজ্ঞাত কলব্যাকগুলি পরিচালনা করে তা দিয়ে রেল 5 এ পরিবর্তন হয়েছিল :

অ্যাক্টিভস্পোর্ট :: কলব্যাকস # স্কিপ_ক্যালব্যাক এখন একটি অরগমেন্টেররার উত্থাপন করে যদি কোনও অবিজ্ঞাত কলব্যাক সরানো হয়

skip_callbackকারখানা থেকে কখন ডাকা হয়, এআর মডেলটিতে আসল কলব্যাক এখনও সংজ্ঞায়িত হয় না।

যদি আপনি সবকিছু চেষ্টা করে থাকেন এবং আমার মতো চুলগুলি টেনে আনেন তবে আপনার সমাধানটি এখানে রয়েছে (ফ্যাক্টরিবট বিষয়গুলি অনুসন্ধান করে এটি পেয়েছে) ( অংশটি দ্রষ্টব্যraise: false ):

after(:build) { YourSweetModel.skip_callback(:commit, :after, :whatever_callback, raise: false) }

আপনার পছন্দের অন্যান্য কৌশলগুলির সাথে এটি নির্দ্বিধায় ব্যবহার করুন।


1
অসাধারণ, আমার সাথে ঠিক এটাই হয়েছিল। মনে রাখবেন যে আপনি যদি একবার কলব্যাক সরিয়ে ফেলে আবার চেষ্টা করেন তবে এটি ঘটে থাকে, তাই সম্ভবত কোনও কারখানার জন্য এটি একাধিকবার ট্রিগার হবে।
slhck

6

এই সমাধানটি আমার পক্ষে কাজ করে এবং আপনার কারখানার সংজ্ঞাতে আপনাকে একটি অতিরিক্ত ব্লক যুক্ত করতে হবে না:

user = FactoryGirl.build(:user)
user.send(:create_without_callbacks) # Skip callback

user = FactoryGirl.create(:user)     # Execute callbacks

5

একটি সহজ স্টাব আরএসপেক 3-এ আমার জন্য সবচেয়ে ভাল কাজ করেছে

allow(User).to receive_messages(:run_something => nil)

4
আপনি এটা জন্য সেট আপ প্রয়োজন চাই দৃষ্টান্ত এর User; :run_somethingএকটি শ্রেণি পদ্ধতি নয়।
পিজেএসকোপল্যান্ড

5
FactoryGirl.define do
  factory :order, class: Spree::Order do

    trait :without_callbacks do
      after(:build) do |order|
        order.class.skip_callback :save, :before, :update_status!
      end

      after(:create) do |order|
        order.class.set_callback :save, :before, :update_status!
      end
    end
  end
end

গুরুত্বপূর্ণ নোট আপনি উভয় নির্দিষ্ট করা উচিত। যদি কেবলমাত্র আগে ব্যবহৃত হয় এবং একাধিক চশমা চালায় তবে এটি একাধিকবার কলব্যাক অক্ষম করার চেষ্টা করবে। এটি প্রথমবার সফল হবে, তবে দ্বিতীয় দিকে, কলব্যাক আর সংজ্ঞায়িত হবে না। সুতরাং এটি ত্রুটি আউট করব


এটি সাম্প্রতিক প্রকল্পের স্যুটটিতে কিছুটা অস্পষ্ট ব্যর্থতা সৃষ্টি করেছিল - আমার কাছে সায়রামের জবাবের অনুরূপ কিছু ছিল তবে পরীক্ষার মধ্যে কলব্যাকটি ক্লাসে সেট না করে ছেড়ে দেওয়া হচ্ছে। উপস।
kfrz

4

আমার কারখানা থেকে স্কিপ_ক্যালব্যাক কল করা আমার পক্ষে সমস্যাযুক্ত প্রমাণিত।

আমার ক্ষেত্রে, আমার আগে এবং পরে কিছু এস 3-সম্পর্কিত কলব্যাক সহ একটি ডকুমেন্ট ক্লাস রয়েছে যা আমি তৈরি করতে চাই যখন পুরো স্ট্যাকের পরীক্ষা করা প্রয়োজন তখনই আমি চালাতে চাই। অন্যথায়, আমি এই এস 3 কলব্যাকগুলি এড়িয়ে যেতে চাই।

আমি যখন আমার ফ্যাক্টরিতে স্কিপ_ক্যালব্যাকগুলি চেষ্টা করেছিলাম তখন কারখানাটি ব্যবহার না করে সরাসরি ডকুমেন্ট অবজেক্ট তৈরি করার পরেও এটি কলব্যাক স্কিপটি বহাল রাখে। সুতরাং পরিবর্তে, আমি পরে বিল্ড কলটিতে মোচা স্টাব ব্যবহার করেছি এবং সবকিছুই নিখুঁতভাবে কাজ করছে:

factory :document do
  upload_file_name "file.txt"
  upload_content_type "text/plain"
  upload_file_size 1.kilobyte
  after(:build) do |document|
    document.stubs(:name_of_before_create_method).returns(true)
    document.stubs(:name_of_after_create_method).returns(true)
  end
end

সব সমাধান এখান থেকে, এবং কারখানা মধ্যে যুক্তিবিজ্ঞান থাকার জন্য, এই মাত্র একটা করে একটি সঙ্গে কাজ করে before_validationহুক (করার চেষ্টা skip_callbackFactoryGirl এর সাথে beforeবা afterবিকল্প buildএবং createকাজ করে নি)
মাইক টি

3

এটি বর্তমান আরএসপেক সিনট্যাক্সের সাথে কাজ করবে (এই পোস্ট হিসাবে) এবং অনেক ক্লিনার:

before do
   User.any_instance.stub :run_something
end

এটি আরএসপেক ৩-এ অবমুক্ত করা হয়েছে আমার জন্য নিয়মিত স্টাব ব্যবহার করে আমার নিচের উত্তরটি দেখুন।
samg

3

আগে_ বৈধকরণ কলব্যাকটি কীভাবে এড়াতে হবে সে সম্পর্কে জেমস শেভালিয়ারের উত্তর আমাকে এতটা সহায়তা করতে পারেনি যদি আপনি এখানে আমার মতো একই স্ট্রাগল করেন তবে সমাধানের সমাধান হচ্ছে:

মডেল:

before_validation :run_something, on: :create

কারখানার মধ্যে:

after(:build) { |obj| obj.class.skip_callback(:validation, :before, :run_something) }

2
আমি মনে করি এটি এড়ানো ভাল। এটি ক্লাসের প্রতিটি উদাহরণের জন্য কলব্যাকগুলি এড়িয়ে যায় (কেবলমাত্র কারখানার মেয়ে দ্বারা উত্পাদিত নয়)। এটি কিছু নির্দিষ্ট নির্বাহের সমস্যার দিকে পরিচালিত করবে (যেমন প্রাথমিক কারখানাটি তৈরির পরে যদি অক্ষম হয় তবে) যা ডিবাগ করা কঠিন। যদি অনুমান / সমর্থনে এটি পছন্দসই আচরণ হয় তবে এটি স্পষ্টভাবে করা উচিত: Model.skip_callback(...)
কেভিন সিলেস্ট্রে

2

আমার ক্ষেত্রে আমার রেডিস ক্যাশে কিছু কলব্যাক রয়েছে। কিন্তু তখন আমার / আমার পরীক্ষার পরিবেশের জন্য কোনও পুনরায় নজির চলেনি।

after_create :load_to_cache

def load_to_cache
  Redis.load_to_cache
end

আমার অবস্থার জন্য, উপরের মতো, আমি load_to_cacheআমার স্পেস_হেল্পারে আমার পদ্ধতিটি কেবল ছড়িয়ে দিয়েছি:

Redis.stub(:load_to_cache)

এছাড়াও, নির্দিষ্ট পরিস্থিতিতে যেখানে আমি এটি পরীক্ষা করতে চাই, কেবলমাত্র সেগুলি সম্পর্কিত আরএসপেক পরীক্ষার ক্ষেত্রে ব্লকের আগেই আনস্টব করতে হবে।

আমি জানি আপনার হতে পারে আরও জটিল কিছু after_createহতে পারে বা এটি খুব মার্জিত নাও পেতে পারে। এই নিবন্ধটির 'কলিংব্যাক বাতিল' বিভাগ অনুসারে আপনি after_createনিজের কারখানায় একটি হুক সংজ্ঞা দিয়ে (ফ্যাক্টরি_গর্ল ডক্স দেখুন), যেখানে আপনি সম্ভবত একই কলব্যাক এবং রিটার্ন সংজ্ঞা দিতে পারবেন যেখানে আপনি আপনার মডেলটিতে সংজ্ঞায়িত কলব্যাক বাতিল করার চেষ্টা করতে পারেন । (আমি যাতে কলব্যাক কার্যকর করা হয় সেই আদেশ সম্পর্কে আমি নিশ্চিত নই, এই কারণেই আমি এই বিকল্পটির জন্য যাইনি)।false

শেষ অবধি, (দুঃখিত আমি নিবন্ধটি সন্ধান করতে পারছি না) রুবি আপনাকে কলব্যাক হুক আনহুক করতে কিছু নোংরা মেটা প্রোগ্রামিং ব্যবহার করার অনুমতি দেয় (আপনাকে এটি পুনরায় সেট করতে হবে)। আমার ধারণা এটি সর্বনিম্ন পছন্দসই বিকল্প হবে।

ঠিক আছে, আরও একটি জিনিস আছে যা আসলেই সমাধান নয়, তবে দেখুন বস্তুটি তৈরির পরিবর্তে আপনি নিজের চশমাগুলিতে ফ্যাক্টরি.বিল্ডের সাথে দূরে সরে যেতে পারেন কিনা see (আপনি যদি পারেন তবে সবচেয়ে সহজ হবে)।


2

উপরে পোস্ট করা উত্তর সম্পর্কে, https://stackoverflow.com/a/35562805/2001785 , আপনাকে কারখানায় কোড যুক্ত করার দরকার নেই। আমি চশমাগুলিতে পদ্ধতিগুলি ওভারলোড করা আরও সহজ পেয়েছি। উদাহরণস্বরূপ, পরিবর্তে (উদ্ধৃত পোস্টে ফ্যাক্টরি কোডের সাথে একত্রে)

let(:user) { FactoryGirl.create(:user) }

আমি (উদ্ধৃত ফ্যাক্টরি কোড ব্যতীত) ব্যবহার করতে পছন্দ করি

let(:user) do
  FactoryGirl.build(:user).tap do |u|
      u.define_singleton_method(:send_welcome_email){}
      u.save!
    end
  end
end

এইভাবে পরীক্ষার আচরণ বোঝার জন্য আপনাকে কারখানা এবং টেস্ট ফাইল উভয়ের দিকে তাকাতে হবে না।


1

ক্লাস স্তরে কলব্যাক চালানো / সেট হওয়ার পরে আমি একটি ক্লিনার উপায় হিসাবে নীচের সমাধানটি পেয়েছি।

# create(:user) - will skip the callback.
# create(:user, skip_create_callback: false) - will set the callback
FactoryBot.define do
  factory :user do
    first_name "Luiz"
    last_name "Branco"

    transient do
      skip_create_callback true
    end

    after(:build) do |user, evaluator|
      if evaluator.skip_create_callback
        user.class.skip_callback(:create, :after, :run_something)
      else
        user.class.set_callback(:create, :after, :run_something)
      end
    end
  end
end

0

এটি জেনেরিক উপায়ে পরিচালনা করার জন্য আমি তৈরি একটি স্নিপেট।
এটি যেমন রেল সম্পর্কিত কলব্যাকগুলি সহ কনফিগার করা প্রতিটি কলব্যাক এড়িয়ে যাবে before_save_collection_associationতবে অ্যাক্টিভেকর্ডকে ঠিকঠাক করার মতো অটোজেনারেটেড কলব্যাকের মতো কিছু প্রয়োজনীয়তা এড়াবে না autosave_associated_records_for_

# In some factories/generic_traits.rb file or something like that
FactoryBot.define do
  trait :skip_all_callbacks do
    transient do
      force_callbacks { [] }
    end

    after(:build) do |instance, evaluator|
      klass = instance.class
      # I think with these callback types should be enough, but for a full
      # list, check `ActiveRecord::Callbacks::CALLBACKS`
      %i[commit create destroy save touch update].each do |type|
        callbacks = klass.send("_#{type}_callbacks")
        next if callbacks.empty?

        callbacks.each do |cb|
          # Autogenerated ActiveRecord after_create/after_update callbacks like
          # `autosave_associated_records_for_xxxx` won't be skipped, also
          # before_destroy callbacks with a number like 70351699301300 (maybe
          # an Object ID?, no idea)
          next if cb.filter.to_s =~ /(autosave_associated|\d+)/

          cb_name = "#{klass}.#{cb.kind}_#{type}(:#{cb.filter})"
          if evaluator.force_callbacks.include?(cb.filter)
            next Rails.logger.debug "Forcing #{cb_name} callback"
          end

          Rails.logger.debug "Skipping #{cb_name} callback"
          instance.define_singleton_method(cb.filter) {}
        end
      end
    end
  end
end

তাহলে পরে:

create(:user, :skip_all_callbacks)

বলাই বাহুল্য, ওয়াইএমএমভি, সুতরাং পরীক্ষার লগগুলিতে একবার নজর দিন আপনি আসলে কী এড়াচ্ছেন। সম্ভবত আপনার কাছে একটি মণি রয়েছে যা আপনার কলব্যাক যুক্ত করছে যা আপনার প্রয়োজন এবং এটি আপনার পরীক্ষাগুলি খারাপভাবে ব্যর্থ করে দেবে বা আপনার 100 টি কলব্যাক ফ্যাট মডেল থেকে আপনার নির্দিষ্ট টেস্টের জন্য কেবল একটি দম্পতি দরকার। এই ক্ষেত্রে, ক্ষণস্থায়ী চেষ্টা করুন:force_callbacks

create(:user, :skip_all_callbacks, force_callbacks: [:some_important_callback])

বোনাস

কখনও কখনও আপনার বৈধতাগুলিও এড়িয়ে চলা দরকার (দ্রুত পরীক্ষা করার জন্য সমস্ত চেষ্টা), তারপরে চেষ্টা করুন:

  trait :skip_validate do
    to_create { |instance| instance.save(validate: false) }
  end

-1
FactoryGirl.define do
 factory :user do
   first_name "Luiz"
   last_name "Branco"
   #...

after(:build) { |user| user.class.skip_callback(:create, :after, :run_something) }

trait :user_with_run_something do
  after(:create) { |user| user.class.set_callback(:create, :after, :run_something) }
  end
 end
end

আপনি যখন এটি চালাতে চান আপনি কেবল সেই উদাহরণগুলির জন্য একটি বৈশিষ্ট্য সহ কলব্যাক সেট করতে পারেন।

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