ruby - জবা ফুলের বৈশিষ্ট্য



আরএসপেকের বিষয় এবং এর মধ্যে পার্থক্য কী? সেগুলি কখন ব্যবহার করা উচিত? (2)

সংক্ষিপ্তসার: আরএসপেকের বিষয়টি একটি বিশেষ ভেরিয়েবল যা পরীক্ষিত অবজেক্টটিকে বোঝায়। এতে প্রত্যাশা অন্তর্নিহিতভাবে সেট করা যেতে পারে, যা এক-লাইনের উদাহরণগুলিকে সমর্থন করে। এটি কিছু মুশকিল ক্ষেত্রে পাঠকের কাছে স্পষ্ট, তবে অন্যথায় বোঝা শক্ত এবং এড়ানো উচিত। আরএসপেকের let ভেরিয়েবলগুলি কেবল অলসভাবে ইনস্ট্যান্টিয়েটেড (মেমোজাইজড) ভেরিয়েবল। এগুলি বিষয়টির মতো অনুসরণ করা ততটা কঠিন নয়, তবে তারা জট বাঁধার পরীক্ষায় নেতৃত্ব দিতে পারে তাই বিচক্ষণতার সাথে ব্যবহার করা উচিত।

বিষয়

কিভাবে এটা কাজ করে

বিষয়টি হচ্ছে পরীক্ষিত বস্তুটি। আরএসপেকের বিষয়টির একটি স্পষ্ট ধারণা রয়েছে। এটি সংজ্ঞায়িত বা নাও হতে পারে। যদি এটি হয় তবে আরএসপেক এটিকে স্পষ্টভাবে উল্লেখ না করেই পদ্ধতিতে কল করতে পারে।

ডিফল্টরূপে, যদি কোনও বহিরাগত উদাহরণ গোষ্ঠীর ( describe বা context ব্লক) প্রথম আর্গুমেন্টটি কোনও শ্রেণি হয়, আরএসপেক that শ্রেণীর একটি উদাহরণ তৈরি করে এবং বিষয়টিতে এটি বরাদ্দ করে। উদাহরণস্বরূপ, নিম্নলিখিত পাস:

class A
end

describe A do
  it "is instantiated by RSpec" do
    expect(subject).to be_an(A)
  end
end

আপনি বিষয়টিকে বিষয় সহ নিজেই সংজ্ঞায়িত করতে পারেন:

describe "anonymous subject" do
  subject { A.new }
  it "has been instantiated" do
    expect(subject).to be_an(A)
  end
end

আপনি বিষয়টিকে এটি সংজ্ঞায়িত করার সময় একটি নাম দিতে পারেন:

describe "named subject" do
  subject(:a) { A.new }
  it "has been instantiated" do
    expect(a).to be_an(A)
  end
end

এমনকি যদি আপনি বিষয়টির নাম দেন, আপনি এখনও বেনামে এটি উল্লেখ করতে পারেন:

describe "named subject" do
  subject(:a) { A.new }
  it "has been instantiated" do
    expect(subject).to be_an(A)
  end
end

আপনি একাধিক নামযুক্ত বিষয় সংজ্ঞায়িত করতে পারেন। সর্বাধিক সংজ্ঞায়িত নামযুক্ত বিষয় হ'ল বেনামী subject

তবে বিষয়টি সংজ্ঞায়িত করা হয়েছে,

  1. এটি অলসভাবে ইনস্ট্যান্টেশনযুক্ত। অর্থাত, বর্ণিত শ্রেণীর অন্তর্নিহিত তাত্পর্য বা subject পাস করা ব্লকের সম্পাদন ঘটানো হয় না যতক্ষণ না subject বা নামকরণ করা বিষয়টিকে উদাহরণ হিসাবে উল্লেখ করা হয়। যদি আপনি চান যে আপনার স্পষ্ট বিষয়টি আগ্রহের সাথে ইনস্ট্যান্ট করা হোক (এর গ্রুপে উদাহরণের আগে), subject! বলুন subject! subject পরিবর্তে।

  2. প্রত্যাশা এটি সুস্পষ্টভাবে সেট করা যেতে পারে ( subject বা একটি নাম লেখা subject লেখা ছাড়া):

    describe A do
      it { is_expected.to be_an(A) }
    end

    এই এক-লাইন বাক্য গঠনটিকে সমর্থন করার জন্য বিষয়টি বিদ্যমান।

কখন এটি ব্যবহার করবেন

একটি অন্তর্নিহিত subject (উদাহরণ গোষ্ঠী থেকে অনুমান করা) কারণ বোঝা কঠিন

  • এটি পর্দার পিছনে তাত্ক্ষণিক।
  • এটি স্পষ্টভাবে ব্যবহার করা হোক ( is_expected ছাড়াই is_expected কল করে) বা স্পষ্টতই ( subject হিসাবে), এটি পাঠককে সেই বস্তুর ভূমিকা বা প্রকৃতি সম্পর্কে কোনও তথ্য দেয় না যার উপর প্রত্যাশা বলা হচ্ছে।
  • ওয়ান-লাইন উদাহরণ সিনট্যাক্সের উদাহরণের বর্ণনা নেই (সাধারণ উদাহরণ সিনট্যাক্সে it স্ট্রিং আর্গুমেন্ট), সুতরাং উদাহরণটির উদ্দেশ্য সম্পর্কে পাঠকের একমাত্র তথ্যটি প্রত্যাশা নিজেই itself

অতএব, প্রসঙ্গটি সমস্ত পাঠকের দ্বারা প্রাসঙ্গিকভাবে ভালভাবে বোঝার সম্ভাবনা থাকে এবং উদাহরণের বর্ণনার জন্য সত্যই প্রয়োজন হয় না এমন ক্ষেত্রে অন্তর্নিহিত বিষয়টি ব্যবহার করা কেবলমাত্র সহায়ক । ক্যানোনিকাল কেসটি কাঁটা ম্যাথারগুলির সাথে অ্যাক্টিভেকর্ড বৈধতা পরীক্ষা করছে:

describe Article do
  it { is_expected.to validate_presence_of(:title) }
end

একটি এক্সপ্লিট অজ্ঞাতনামা subject (নাম বাদে subject দিয়ে সংজ্ঞায়িত) কিছুটা ভাল, কারণ পাঠক দেখতে পাবেন এটি কীভাবে ইনস্ট্যান্ট হয়, তবে

  • এটি এখনও বিষয়টির ইনস্ট্যান্টেশনটি যেখানে এটি ব্যবহার করা হয়েছে তার থেকে দূরে রাখতে পারে (উদাহরণস্বরূপ একটি উদাহরণ গোষ্ঠীর শীর্ষে এটি ব্যবহার করে এমন অনেক উদাহরণ রয়েছে), যা এখনও অনুসরণ করা শক্ত এবং
  • এতে অন্যান্য সমস্যা রয়েছে যা অন্তর্ভুক্ত বিষয়টি করে।

একটি নামযুক্ত বিষয়টি একটি উদ্দেশ্য-প্রকাশকারী নাম সরবরাহ করে, তবে একটি let ভেরিয়েবলের পরিবর্তে নামকরণের বিষয়টি ব্যবহারের একমাত্র কারণ হ'ল আপনি যদি কিছু সময় বেনামী বিষয় ব্যবহার করতে চান, এবং আমরা কেবল কারণ ব্যাখ্যা করেছি বেনামে বিষয়টি কেন বোঝা শক্ত? ।

সুতরাং, সুস্পষ্ট বেনামেয় subject বা নামযুক্ত বিষয়ের বৈধ ব্যবহার খুব বিরল

চলকগুলি let

তারা কিভাবে কাজ করে

ভেরিয়েবল দুটি পার্থক্য বাদে কেবল নামকরণের বিষয়গুলির মতো হওয়া let :

  • তারা let / let! দিয়ে সংজ্ঞায়িত হয় let! subject / subject! পরিবর্তে subject!
  • তারা বেনামে subject সেট করে না বা প্রত্যাশাকে এতে সুস্পষ্টভাবে ডেকে আনে।

এগুলি কখন ব্যবহার করবেন

উদাহরণগুলির মধ্যে সদৃশতা হ্রাস করতে এটি ব্যবহার করা সম্পূর্ণ বৈধ। যাইহোক, এটি কেবল তখনই করুন যখন এটি পরীক্ষার স্পষ্টতা ত্যাগ করে না। let ব্যবহারের সবচেয়ে নিরাপদ সময় হ'ল let ভেরিয়েবলের উদ্দেশ্যটি তার নাম থেকে পুরোপুরি পরিষ্কার হয়ে যায় (যাতে প্রতিটি উদাহরণ বোঝার জন্য পাঠককে এমন সংজ্ঞাটি খুঁজে না নিতে হয় যা অনেকগুলি লাইন দূরে থাকতে পারে) এবং এটি ব্যবহৃত হয় প্রতিটি উদাহরণে একইভাবে। যদি এই বিষয়গুলির মধ্যে দুটিও সত্য না হয়, তবে প্লেইন পুরাতন স্থানীয় ভেরিয়েবলে অবজেক্টটি সংজ্ঞায়িত করার বা উদাহরণের সাথে কারখানার পদ্ধতি কল করার বিষয়ে বিবেচনা করুন।

let! ঝুঁকিপূর্ণ, কারণ এটি অলস নয়। যদি কেউ উদাহরণ দলে একটি উদাহরণ যুক্ত করে তবে এতে let! রয়েছে let! , তবে উদাহরণটির দরকার নেই let! পরিবর্তনশীল,

  • উদাহরণটি বুঝতে অসুবিধা হবে, কারণ পাঠক দেখতে let! পরিবর্তনশীল এবং বিস্মিত হয় এবং কীভাবে এটি উদাহরণকে প্রভাবিত করে
  • উদাহরণটি যতটা প্রয়োজন তার চেয়ে ধীর হয়ে যাবে কারণ let! তৈরি করতে সময় লাগছিল let! variablle

সুতরাং ব্যবহার let! যদি কিছুটা হয় তবে কেবলমাত্র ছোট্ট, সাধারণ উদাহরণের গ্রুপগুলিতে যেখানে ভবিষ্যতের উদাহরণ লেখকরা সেই ফাঁদে পড়ার সম্ভাবনা কম।

একক প্রত্যাশা-প্রতি-উদাহরণ ফেটিশ

বিষয়গুলির একটি সাধারণ অতিরিক্ত ব্যবহার বা ভেরিয়েবলগুলি পৃথকভাবে আলোচনার জন্য উপযুক্ত। কিছু লোক তাদের এগুলি ব্যবহার করতে পছন্দ করে:

describe 'Calculator' do
  describe '#calculate' do
    subject { Calculator.calculate }
    it { is_expected.to be >= 0 }
    it { is_expected.to be <= 9 }
  end
end

(এটি এমন পদ্ধতির একটি সাধারণ উদাহরণ যা একটি সংখ্যার প্রত্যাবর্তন করে যার জন্য আমাদের দুটি প্রত্যাশা প্রয়োজন, তবে এই শৈলীতে আরও অনেকগুলি উদাহরণ / প্রত্যাশা থাকতে পারে যদি পদ্ধতিটি আরও জটিল মূল্য দেয় যা অনেক প্রত্যাশার প্রয়োজন হয় এবং / অথবা এর অনেকগুলি পার্শ্ব প্রতিক্রিয়া রয়েছে) সবার প্রত্যাশা দরকার।)

লোকেরা এগুলি করেছে কারণ তারা শুনেছেন যে উদাহরণের জন্য একজনের কেবলমাত্র একটি প্রত্যাশা থাকা উচিত (যা বৈধ নিয়মের সাথে মিশে গেছে যে উদাহরণ হিসাবে কেবলমাত্র একটি পদ্ধতি কল পরীক্ষা করা উচিত) বা তারা আরএসপেকের কৌতূহলের প্রেমে রয়েছে। এটি কোনও অজ্ঞাতনামা বা নামযুক্ত বিষয় বা let ভেরিয়েবলের সাথে না করে! এই শৈলীতে বেশ কয়েকটি সমস্যা রয়েছে:

  • বেনামে বিষয় উদাহরণগুলির বিষয় নয় - পদ্ধতিটি বিষয়। এইভাবে পরীক্ষা লেখার ফলে ভাষাটি স্ক্রু হয়ে যায়, এটি সম্পর্কে ভাবা শক্ত করে তোলে।
  • সর্বদা এক-লাইনের উদাহরণ সহ, প্রত্যাশার অর্থ ব্যাখ্যা করার মতো কোনও জায়গা নেই।
  • বিষয়টি প্রতিটি উদাহরণের জন্য তৈরি করতে হবে, যা ধীর।

পরিবর্তে, একটি একক উদাহরণ লিখুন:

describe 'Calculator' do
  describe '#calculate' do
    it "returns a single-digit number" do
      result = Calculator.calculate
      expect(result).to be >= 0
      expect(result).to be <= 9
    end
  end
end

https://src-bin.com

http://betterspecs.org/#subject subject সম্পর্কে কিছু তথ্য রয়েছে এবং let । তবে তাদের মধ্যে পার্থক্য সম্পর্কে আমি এখনও অস্পষ্ট। তদুপরি, এসও পোস্ট আরএসপেক পরীক্ষায় আগে ব্যবহার করা, দেওয়া এবং বিষয় ব্যবহার করার বিরুদ্ধে যুক্তি কী? বলেছে subject বা না ব্যবহার না করাই ভাল। আমি কোথায় যাব? আমি তাই বিভ্রান্ত.


Answer #1

Subject এবং let হ'ল সরঞ্জামগুলি আপনাকে পরিষ্কার এবং আপনার পরীক্ষাগুলি বাড়িয়ে তুলতে সহায়তা করার জন্য tools আরএসপেক সম্প্রদায়ের লোকেরা এগুলি ব্যবহার করে তাই আমি সেগুলি ব্যবহার করা ঠিক কি না তা নিয়ে চিন্তা করব না। এগুলি একইভাবে ব্যবহার করা যায় তবে কিছুটা ভিন্ন উদ্দেশ্যে পরিবেশন করা যায়

Subject আপনাকে একটি পরীক্ষার বিষয় ঘোষণার অনুমতি দেয় এবং তারপরে পরবর্তী কোনও পরীক্ষার ক্ষেত্রে এটি পুনরায় ব্যবহার করতে পারে। এটি কোড পুনরাবৃত্তি হ্রাস করে (আপনার কোডটি DRYing করছে)

Let before: each বিকল্প before: each ব্লক, যা পরীক্ষার ডেটা উদাহরণ ভেরিয়েবলগুলিকে বরাদ্দ করে। Let আপনাকে কয়েকটি সুবিধা দেয়। প্রথমত, এটি উদাহরণের পরিবর্তনশীলকে নির্ধারিত না করে মানটিকে ক্যাশে করে। দ্বিতীয়ত, এটি অলসভাবে মূল্যায়ন করা হয়, যার অর্থ এটি কোনও স্পেস না বললে মূল্যায়ন হয় না। এইভাবে আপনাকে আপনার পরীক্ষাগুলি দ্রুত করতে সহায়তা করে। আমি আরও মনে করি let পড়া সহজ হয়





rspec