রেল / আরএসপেকের ব্যতিক্রম উত্থাপন কীভাবে পরীক্ষা করবেন?


86

নিম্নলিখিত কোড রয়েছে:

def index
    @car_types = car_brand.car_types
end

def car_brand
    CarBrand.find(params[:car_brand_id])
    rescue ActiveRecord::RecordNotFound
        raise Errors::CarBrandNotFound.new 
end

আমি এটি আরএসপেকের মাধ্যমে পরীক্ষা করতে চাই। আমার কোডটি হ'ল:

it 'raises CarBrandNotFound exception' do
    get :index, car_brand_id: 0
    expect(response).to raise_error(Errors::CarBrandNotFound)
end

0 সমান আইডি সহ কারব্র্যান্ড উপস্থিত নেই, সুতরাং আমার নিয়ামক কোড ত্রুটিগুলি উত্থাপন করে: CarBrandNotFound, তবে আমার পরীক্ষার কোডটি আমাকে বলে যে কিছুই উত্থাপিত হয়নি। আমি কীভাবে এটি ঠিক করতে পারি? আমি কী ভুল করছি?

উত্তর:


116

ত্রুটি পরিচালনার ক্ষেত্রে নির্দিষ্ট করতে, আপনার প্রত্যাশাগুলি একটি ব্লকে সেট করা দরকার; কোনও বস্তুর মূল্যায়ন ত্রুটি বাড়াতে পারে না।

সুতরাং আপনি এই জাতীয় কিছু করতে চান:

expect {
  get :index, car_brand_id: 0
}.to raise_error(Errors::CarBrandNotFound)

বিশদটির জন্য প্রত্যাশা ত্রুটি দেখুন ।

আমি খানিকটা অবাক হয়েছি যে, যদিও আপনি আপনার নির্দিষ্ট ফলাফলগুলিতে কোনও আপত্তি পান না।


4
@ jakob-s প্রত্যাশা ত্রুটি আচরণ যা আপনি এখানে ব্যবহার করছেন তা নিয়ামক অনুরোধগুলিতে কাজ করে না। get :index, car_brand_id: 0নিজেই একটি ত্রুটি বাড়াতে না।
রিকার্ডো ওটারো

@ রিকার্ডো ওটারো জিনিসগুলি পরিবর্তিত হতে পারে, তবে এটির মূল্য কী হবে তা আমার পক্ষে হয়: gist.github.com/koppen/0e1d0894a908a3768847 । তবে অবশ্যই, স্ট্যাকের কোনও কিছু সম্ভবত ত্রুটিটি পরিচালনা করছে কারণ এটি স্পষ্ট রানার পর্যন্ত বুদবুদ।
জাকব এস

এটি বর্তমান আরএসপেক সংস্করণগুলির সঠিক উত্তর হ'ল উত্তরগুলি ভোট দেওয়া উচিত
নিল উডস

ঐটা ঠিক. ব্যতিক্রমগুলি পরীক্ষা করতে সঠিক ফর্মটি পদ্ধতি ব্যতীত () এর পরিবর্তে {using ব্যবহার করছে।
লুইজ হেনরিক 4

111

expect{}পরিবর্তে ব্যবহার করুন expect()


7
এটি ইঙ্গিত করার মতো যে এটি এই সমস্যার সমাধান করে কারণ প্রদত্ত ব্যতিক্রম উত্থাপনের জন্য।} বাক্য গঠনটি নিরীক্ষণের জন্য একটি ব্লক তৈরি করে। কোডের একটি ব্লক একটি ব্যতিক্রম উত্থাপন করে তা পরীক্ষা করার সময় মিনিস্টেস্টের অনুরূপ সিনট্যাক্স প্রয়োজনীয়তা রয়েছে।
আরগুস

4
এত ছোট ডাঙ বদল। কিছুক্ষণ আমার চাকা পিষে রেখেছিল এর জন্য ধন্যবাদ.
জোশ

4
আমি এটা বিশ্বাস করতে পারি না। চেষ্টা এবং এটা বাঁক দৈনিক 1 ঘন্টা ( )মধ্যে { }! আপনাকে অনেক ধন্যবাদ
সাইমন ফ্রানজেন

4
হ্যাঁ, আমার জন্যও এটি - আমি বিশ্বাস করি যে আমি বেশি ব্যয় করেছি :) এর কারণেই আমি এখানে সমাধান পোস্ট করেছি
kaleb4eg

4
আমি জানি যে জিজ্ঞাসা করার জন্য আমার মন্তব্যগুলি ব্যবহার করা উচিত ... তবে তবুও, আমি প্রতিক্রিয়ার জন্য আপনাকে ধন্যবাদ জানাতে চাই। একাধিক পদ্ধতির পরে অবশেষে আমি আমার সমস্যার সমাধান খুঁজে পেয়েছি।
ফ্লোরিন লেই

18

get :index কখনই একটি ব্যতিক্রম উত্থাপন করবে না - এটি বরং সত্যিকারের সার্ভারের মতো কোনও উপায়ে 500 ত্রুটি হিসাবে প্রতিক্রিয়া সেট করবে।

পরিবর্তে চেষ্টা করুন:

it 'raises CarBrandNotFound exception' do
  controller.params[:car_brand_id] = 0
  expect{ controller.car_brand }.to raise_error(Errors::CarBrandNotFound)
end

4
আমি আনন্দিত যে কেউ এটি উল্লেখ করেছে! :) জাকব তাদের শিক্ষিত করার চেষ্টা করেছিলেন যে এটি সর্বাধিক উত্সাহিত উত্তরে কখনও ব্যতিক্রম বাড়াতে পারে না তবে তাকে কিছু ভুল প্রতিরোধের মুখোমুখি হয়েছিল। 👍
তারেক এন। এলসামনি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.