আরএসপেক: "অ্যারে.শোল্ড == অন্য_আরে" তবে অর্ডারের জন্য উদ্বেগ ছাড়াই


235

আমি প্রায়শই অ্যারে তুলনা করতে এবং নিশ্চিত করতে চাই যে সেগুলি একই উপাদান রয়েছে, কোনও ক্রমে। আরএসপেক-এ এটি করার কোনও সংক্ষিপ্ত উপায় আছে?

এখানে এমন পদ্ধতি রয়েছে যা গ্রহণযোগ্য নয়:

#to_set

উদাহরণ স্বরূপ:

expect(array.to_set).to eq another_array.to_set

অথবা

array.to_set.should == another_array.to_set

অ্যারেগুলিতে সদৃশ আইটেম থাকে যখন এটি ব্যর্থ হয়।

#sort

উদাহরণ স্বরূপ:

expect(array.sort).to eq another_array.sort

অথবা

array.sort.should == another_array.sort

অ্যারে উপাদানগুলি প্রয়োগ না করে এটি ব্যর্থ হয় #<=>


7
স্মার্টাসকে নয়, তুলনা করা to_setএবং sizeআসলে যা চান তা করেন না। যেমন [ক, খ, খ] মিলবে [ক, ক, খ]। চিয়ার্স!
জো লিস

3
বিপরীতে ভাবতে যারা এখানে হোঁচট খেয়েছে তাদের জন্য: ক্রম একই হওয়া উচিতeqম্যাচার ব্যবহার করুন , উদাহরণস্বরূপexpect([1, 2]).to_not eq([2, 1])
ডেনিস

উত্তর:


263

চেষ্টা array.should =~ another_array

আমি এটির সর্বোত্তম ডকুমেন্টেশনটি কোডটি নিজেই পাই যা এখানে রয়েছে


এটি অর্ডারটিকে বিবেচনায় নেয় না, সুতরাং এটি কোনও গ্রহণযোগ্য উত্তর নয়, তাই না? উদ্ধৃতিটা ডক্স : Passes if actual contains all of the expected regardless of order.
জোশুয়া মুহিম 22'13

16
এই পোস্টের শিরোনাম: "আরএসপেক:" অ্যারে.শোল্ড == অন্য_আরে "তবে অর্ডার নিয়ে উদ্বেগ ছাড়াই"
x1a4


7
আপনি যদি আরএসপেক ৩.০-তে পাওয়া নতুন "প্রত্যাশা" সিনট্যাক্সটি ব্যবহার করছেন তবে @ জোশকোভাচের উত্তর দেখুন।
ক্লোজাচ

46
আরএসপেক synt.০ সিনট্যাক্সটি expect([1, 2, 3]).to match_array([2, 1, 3])দেখা: stackoverflow.com/a/19436763/33226
গ্যাভিন মিলার

238

আরএসপেক ২.১১ যেহেতু আপনি এটিও ব্যবহার করতে পারেন match_array

array.should match_array(another_array)

যা কিছু ক্ষেত্রে বেশি পঠনযোগ্য হতে পারে।

[1, 2, 3].should =~ [2, 3, 1]
# vs
[1, 2, 3].should match_array([2, 3, 1])

8
হ্যাঁ, সবেমাত্র রেল 4 এ উন্নীত হয়েছে এবং = where যেখানে ম্যাচ_রেই ঠিকঠাক কাজ করে সেখানে কাজ বন্ধ করে দিয়েছে, ধন্যবাদ!
opsb

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

1
"নির্ভুল" জন্য, আপনার কাছে সর্বদা থাকে eq(), সুতরাং আমার ধারণা match_array()আমার পক্ষে যথেষ্ট অস্পষ্ট।
এভেন্ডেট

আদেশযুক্ত তালিকায় এটি আমার পক্ষে কাজ করে না। এটি মনে করে যে তালিকাগুলি, যা বিভিন্ন ক্রমে একই আইটেম রয়েছে, একই। :-(
জাঙ্গোফান

এফডাব্লুআইডাব্লু ( ডকুমেন্টেশন )match_arraycontain_exactly
রুই ডিয়াজ

136

আমি =~অনুমানযোগ্য বলে মনে করেছি এবং এটি কোনও আপাত কারণে ব্যর্থ হয়েছে। অতীতে 2.14, আপনার সম্ভবত ব্যবহার করা উচিত

expect([1, 2, 3]).to match_array([2, 3, 1])

17
এছাড়াও বৈধ গত 3.0: expect([1, 2, 3]).to contain_exactly(2, 3, 1)relishapp.com/rspec/rspec-expectations/v/3-0/docs/…
ক্লোজাচ

13

ব্যবহার করুন match_array, যা অন্য একটি অ্যারেটিকে আর্গুমেন্ট হিসাবে গ্রহণ করে বা contain_exactly, যা প্রতিটি উপাদানকে পৃথক যুক্তি হিসাবে গ্রহণ করে এবং পাঠের জন্য কখনও কখনও দরকারী। ( ডকস )

উদাহরণ:

expect([1, 2, 3]).to match_array [3, 2, 1]

অথবা

expect([1, 2, 3]).to contain_exactly 3, 2, 1

3

আরএসপেক 3 ব্যবহারের জন্য contain_exactly:

বিশদের জন্য https://relishapp.com/rspec/rspec-expectations/v/3-2/docs/built-in-matchers/contain-exactly-matcher দেখুন , তবে এখানে একটি নির্যাস:

কন্টেন্ট_একটি ম্যাচচার একে অপরের বিরুদ্ধে অ্যারেগুলি পরীক্ষা করার একটি উপায় প্রদান করে যা প্রকৃত এবং প্রত্যাশিত অ্যারের মধ্যে ক্রমকে পৃথক করে। উদাহরণ স্বরূপ:

    expect([1, 2, 3]).to    contain_exactly(2, 3, 1) # pass
    expect([:a, :c, :b]).to contain_exactly(:a, :c ) # fail

অন্যরা যেমন উল্লেখ করেছে, আপনি যদি বিপরীতকে দৃsert়ভাবে বলতে চান যে অ্যারেগুলি উভয় বিষয়বস্তু এবং শৃঙ্খলার সাথে মেলে, তবে ব্যবহার করুন eq:

    expect([1, 2, 3]).to    eq([1, 2, 3]) # pass
    expect([1, 2, 3]).to    eq([2, 3, 1]) # fail

1

খুব ভাল নথিভুক্ত করা হয়নি তবে আমি যাইহোক লিঙ্কগুলি যুক্ত করেছি:

আরএসপেক 3 ডক্স

expect(actual).to eq(expected)


আরএসপেক 2 ডক্স

expect([1, 2, 3]).to match_array([2, 3, 1])


11
উভয়ই প্রত্যাশা (প্রকৃত)। টু একা (প্রত্যাশিত) এবং প্রত্যাশা (প্রকৃত)। টু ম্যাচ_আররে (প্রত্যাশিত) আরএসপিপ 3 এ কাজ করে তবে তারা বিভিন্ন জিনিস করছে। # ম্যাচ_আররে ক্রমটি অগ্রাহ্য করে, যখন # শ্রেনী তা করে না।
guki

1
এটি প্রশ্নের উত্তর দেয় না, যেহেতু ওপি বিশেষত আদেশটিকে অবহেলা করতে বলেছিল।
নোবডিসনাটমেয়ার

হ্যাঁ! এটি আমার পক্ষে কাজ করেছে। উপাদানগুলির ক্রম একই না হলে একটি তুলনা ব্যর্থ হয়। ধন্যবাদ! আমি .to eqপদ্ধতিটি উল্লেখ করি , না match_array
জাজোফান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.