কীভাবে কোনও রকম ব্যতিক্রম নিয়ে আরএসপেকের should_raise ব্যবহার করবেন?


211

আমি এরকম কিছু করতে চাই:

some_method.should_raise <any kind of exception, I don't care>

আমি এই কিভাবে করা উচিত?

some_method.should_raise exception

... কাজ করে না।

উত্তর:


380
expect { some_method }.to raise_error

আরএসপেক 1 সিনট্যাক্স:

lambda { some_method }.should raise_error

আরও জন্য ডকুমেন্টেশন (আরএসপেক 1 সিনট্যাক্সের জন্য) এবং আরএসপেক 2 ডকুমেন্টেশন দেখুন।


5
আহ .. আমি কেবল কোঁকড়া ধনুর্বন্ধনী লক্ষ্য করেছি!
লুই লন্ডন

88

আরএসপেক 2

expect { some_method }.to raise_error
expect { some_method }.to raise_error(SomeError)
expect { some_method }.to raise_error("oops")
expect { some_method }.to raise_error(/oops/)
expect { some_method }.to raise_error(SomeError, "oops")
expect { some_method }.to raise_error(SomeError, /oops/)
expect { some_method }.to raise_error(...){|e| expect(e.data).to eq "oops" }

# Rspec also offers to_not:
expect { some_method }.to_not raise_error
...

দ্রষ্টব্য: raise_errorএবং raise_exceptionবিনিময়যোগ্য।

আরএসপেক ঘ

lambda { some_method }.should raise_error
lambda { some_method }.should raise_error(SomeError)
lambda { some_method }.should raise_error(SomeError, "oops")
lambda { some_method }.should raise_error(SomeError, /oops/)
lambda { some_method }.should raise_error(...){|e| e.data.should == "oops" }

# Rspec also offers should_not:
lambda { some_method }.should_not raise_error
...

দ্রষ্টব্য: এর raise_errorজন্য একটি উপনাম raise_exception

ডকুমেন্টেশন: https://www.relishapp.com/rspec

আরএসপেক 2:

আরএসপেক 1:


এটি একটি দুর্দান্ত উত্তর ছিল।
জিগি

ব্যতিক্রম বার্তায় সাবস্ট্রিং চেক করার দুর্দান্ত পদ্ধতি হ'ল উত্স_আরর (/ ওফস /)
সার্জ সেলেটস্কি

1
উত্থাপন_অরর এবং উত্থাপন_প্রকাশের জন্য বিনিময়যোগ্য (y)
ইয়ো লুড্কে

85

ল্যাম্বদা পরিবর্তে, প্রত্যাশা ব্যবহার করুন:

   expect { some_method }.to raise_error

এটি আরএসপেকের সাম্প্রতিক সংস্করণগুলির জন্য প্রয়োগ করা হয়, অর্থাৎ আরএসপেক ২.০ এবং তার বেশি সংস্করণ।

আরও জন্য ডকো দেখুন।


আমি এটি আরএসপেক 1 এর জন্য ব্যবহার করব না তবে আরএসপেক 2 এর জন্য এটি ঠিক যেমন কাজ করবে তেমন কাজ করে।
এরিক্রাইও

6
প্রকৃতপক্ষে, উপরের ডকুমেন্টেশনের লিঙ্ক অনুসারে, এটি প্রত্যাশা করা
গার্নিয়ার

আপনার মন্তব্য বা আপনার লিঙ্ক করা পৃষ্ঠাটি কেন expectতার চেয়ে ভাল বা খারাপ তা ব্যাখ্যা করে না lambda
ক্রেজেন জাভিয়ার সিটেকার

1
প্রত্যাশা আরএসপেক ২.০ এবং উচ্চতর ক্ষেত্রে। এই আর্গুমেন্টের যা প্রায় এক উত্তম তর্ক করা উপস্থাপনা, যেহেতু ল্যামডা সিনট্যাক্স কোন কাজ করে না
রব

এটি ক্যাপিবায়ার জন্য আমার পক্ষে কাজ করে না:expect { visit welcome_path }.to raise_error
nnyby

65

সিনট্যাক্সটি সম্প্রতি পরিবর্তিত হয়েছে এবং এটি এখন:

expect { ... }.to raise_error(ErrorClass)

4

rspec-expectionsরত্নের ৩.৩ সংস্করণ থেকে কোনও পরামিতি ছাড়াই ফাঁকা উত্থাপন_ররের জন্য একটি সতর্কতা উত্থাপন করা হয়েছে

expect { raise StandardError }.to raise_error # results in warning
expect { raise StandardError }.to raise_error(StandardError) # fine

এটি আপনাকে এমন একটি ইঙ্গিত দেয় যা আপনার কোড পরীক্ষা করার উদ্দেশ্যে পরীক্ষার চেয়ে আলাদা ত্রুটির সাথে ব্যর্থ হতে পারে।

সতর্কতা: raise_errorনির্দিষ্ট ত্রুটি বা বার্তা সরবরাহ না করে ম্যাচার ব্যবহার করা মিথ্যা ধনাত্মক ঝুঁকির ঝুঁকি রয়েছে, যেহেতু raise_errorরুবি যখন উত্থাপন করবে তখনই মিলবে NoMethodError, NameErrorবা ArgumentErrorআপনি যে পদ্ধতিতে কল করতে চান সেই পদ্ধতিটি কার্যকর না করেও প্রত্যাশাটি পাস করার সম্ভাবনা দেয়। পরিবর্তে একটি নির্দিষ্ট ত্রুটি শ্রেণি বা বার্তা সরবরাহ বিবেচনা করুন। এই বার্তাটি সেটিংস এর দ্বারা supressed করা যেতে পারে: RSpec::Expectations.configuration.warn_about_potential_false_positives = false

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