কীভাবে কারাগারে একটি উদ্বেগ পরীক্ষা করতে হয়


104

দেওয়া হয়েছে যে আমার Personableআমার রেলস 4 অ্যাপ্লিকেশনটিতে একটি উদ্বেগ রয়েছে afull_name পদ্ধতি রয়েছে, আমি কীভাবে আরএসপেক ব্যবহার করে এটি পরীক্ষা করতে যাব?

উদ্বেগ / personable.rb

module Personable
  extend ActiveSupport::Concern

  def full_name
    "#{first_name} #{last_name}"
  end
end

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

জেল ActiveSupport::Concernথেকে বের করা হয়নি? আমি ভেবেছিলাম এটি একটু আগে গিয়েছিল।
রাসেল

@ লাইজারভিস আমি ডাব্লু / ফ্যাক্টরিগার্ল বরাবর আরএসপিকে ব্যবহার করছি
কাইল


4
@ রাসেল আমি একমত এটি বলেছিল, আমি কাউকে তাদের প্রশ্নে সাহায্য করব না কারণ তারা কোনও কাজ করার জন্য একটি রেল-ওয়াইয়ের পথ অনুসরণ করেছিল যা আমি এর সাথে একমত নই। যাইহোক এটি এই প্রশ্নটির বিষয়টি থেকে পালানোর এক ধরণের বিষয় :-)
লি জার্ভিস

উত্তর:


176

আপনি যে পদ্ধতিটি পেয়েছেন সেটি অবশ্যই কিছুটা কার্যকারিতা পরীক্ষা করার জন্য কাজ করবে তবে বেশ ভঙ্গুর বলে মনে হচ্ছে — আপনার ডামি ক্লাস (আসলে Structআপনার সমাধানের মধ্যে একটি ) সম্ভবত একটি বাস্তব শ্রেণীর মতো আচরণ করতে পারে বা নাও পারেinclude আপনার উদ্বেগের । অতিরিক্ত হিসাবে আপনি যদি মডেল উদ্বেগগুলি পরীক্ষা করার চেষ্টা করছেন, আপনি সেই অনুযায়ী ডেটাবেস সেট আপ না করে অবজেক্টের বৈধতা পরীক্ষা করতে বা অ্যাক্টিভেকর্ড কলব্যাকের অনুরোধ করার মতো জিনিসগুলি করতে সক্ষম হবেন না (কারণ আপনার ডামি ক্লাসে ডেটাবেস টেবিলের ব্যাকিং থাকবে না) এটা)। তদুপরি, আপনি কেবল উদ্বেগকেই পরীক্ষা করতে চান না বরং আপনার মডেল চশমাগুলির মধ্যে উদ্বেগের আচরণটিও পরীক্ষা করতে চান।

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

# app/models/concerns/personable.rb
module Personable
  extend ActiveSupport::Concern

  def full_name
    "#{first_name} #{last_name}"
  end
end

# spec/concerns/personable_spec.rb
require 'spec_helper'

shared_examples_for "personable" do
  let(:model) { described_class } # the class that includes the concern

  it "has a full name" do
    person = FactoryBot.build(model.to_s.underscore.to_sym, first_name: "Stewart", last_name: "Home")
    expect(person.full_name).to eq("Stewart Home")
  end
end

# spec/models/master_spec.rb
require 'spec_helper'
require Rails.root.join "spec/concerns/personable_spec.rb"

describe Master do
  it_behaves_like "personable"
end

# spec/models/apprentice_spec.rb
require 'spec_helper'

describe Apprentice do
  it_behaves_like "personable"
end

আপনি যখন এআর কলব্যাকগুলি শুরু করার মতো আপনার উদ্বেগের কাজগুলি শুরু করেন তখন এই পদ্ধতির সুবিধাগুলি আরও স্পষ্ট হয়ে ওঠে, যেখানে কোনও আর এজেটের চেয়ে কম কিছু করা সম্ভব হয় না।


2
এর একটি অসুবিধা হ'ল এটি ধীর হয়ে যাবে parallel_tests। আমার মনে হয় এটা পরিবর্তে ব্যবহার করার আলাদা পরীক্ষা আছে ভাল হবে shared_examples_forএবং it_behaves_like
আর্টেম কালিনচুক

6
@ আর্টেমক্যালিনচুক আমি নিশ্চিত নই যে এটি সত্য, প্রতি গিথুব.com / grosser / parallel_tests / issues / 168parallel_tests প্রতি ফাইল ভিত্তিক, তাই ভাগ করা উদাহরণগুলি এটিকে ধীর করে না। আমি আরও যুক্তি দিয়ে বলব যে সঠিকভাবে ভাগ করে নেওয়া আচরণগুলি, ট্রাম্পগুলির পরীক্ষার গতিটি সঠিকভাবে গোষ্ঠীযুক্ত।
হারুন কে


1
সেই লিঙ্কটিতে উদ্বেগের ডিরেক্টরি অন্তর্ভুক্ত করার বিষয়ে আমি কিছুই খুঁজে পাইনি। আপনি কিভাবে দয়া করে তা পরিষ্কার করতে পারেন? আমি আমার উদ্বেগের একটিতে মডিউলটি সনাক্ত করতে আমার আরএসপেক পরীক্ষা পেতে পারি না।
জ্যাক স্মিথ

4
_specভাগ করা_সামান্য_যুক্ত ফাইলের নামের সাথে (এই ক্ষেত্রে ব্যক্তিযোগ্য_স্পেক.আরবি) যুক্ত করবেন না , অন্যথায় আপনি একটি বিভ্রান্তিকর সতর্কতা বার্তা পাবেন - github.com/rspec/rspec-core/issues/828
লালু

62

আমি যে মন্তব্য পেয়েছি তার প্রতিক্রিয়া হিসাবে, আমি এখানে যা করতে শেষ করেছি তা এখানে রয়েছে (যদি কারওর উন্নতি হয় তবে দয়া করে সেগুলি পোস্ট করতে দ্বিধা বোধ করুন) :

বৈশিষ্ট / উদ্বেগ / personable_spec.rb

require 'spec_helper'

describe Personable do
  let(:test_class) { Struct.new(:first_name, :last_name) { include Personable } }
  let(:personable) { test_class.new("Stewart", "Home") }

  it "has a full_name" do
    expect(personable.full_name).to eq("#{personable.first_name} #{personable.last_name}")
  end
end

1
হ্যাঁ, যদি ডাকা হয় এমন একটি বাস্তব শ্রেণীর পরীক্ষার ঘটনা ঘটে তবে এটি অন্যান্য পরীক্ষাগুলি ভঙ্গ করবে Person। আমি ঠিক করতে সম্পাদনা করব।
রাসেল

এটি কাজ করে না। এটি আমাকে ত্রুটি দেয়:undefined method 'full_name' for #<struct first_name="Stewart", last_name="Home">
কাইল ডিকট

প্রসারিত করার পরিবর্তে ব্যাক্তিগতকে অন্তর্ভুক্ত করার চেষ্টা করুন। আমি উত্তর আপডেট করব।
রাসেল

এখন দুর্দান্ত কাজ করে। আমাকে সঠিক দিকে ইশারা করার জন্য এবং রিস্যাক্টর @ রাসেলকে সহায়তা করার জন্য ধন্যবাদ
কাইল

দুর্দান্ত কাজ করে এবং দুর্দান্ত দেখায়
এডওয়ার্ড

7

অন্য চিন্তাভাবনাটি এই জাতীয় জিনিসগুলি পরীক্ষার জন্য with_model রত্ন ব্যবহার করা । আমি একটি উদ্বেগ নিজেকে পরীক্ষা করতে খুঁজছি হয় এবং দেখা যায় এই কাজ pg_search মণি । স্বতন্ত্র মডেলগুলির পরীক্ষার চেয়ে এটি অনেক বেশি ভাল বলে মনে হচ্ছে, যেহেতু সেগুলি পরিবর্তিত হতে পারে এবং আপনি আপনার বিশেষায় যে জিনিসগুলি প্রয়োজন সেগুলি সংজ্ঞায়িত করা ভাল।

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