JSON তুলনা সমাধান
একটি পরিষ্কার কিন্তু সম্ভাব্য বৃহত ডিফ ফলন দেয়:
actual = JSON.parse(response.body, symbolize_names: true)
expected = { foo: "bar" }
expect(actual).to eq expected
বাস্তব তথ্য থেকে কনসোল আউটপুট উদাহরণ:
expected: {:story=>{:id=>1, :name=>"The Shire"}}
got: {:story=>{:id=>1, :name=>"The Shire", :description=>nil, :body=>nil, :number=>1}}
(compared using ==)
Diff:
@@ -1,2 +1,2 @@
-:story => {:id=>1, :name=>"The Shire"},
+:story => {:id=>1, :name=>"The Shire", :description=>nil, ...}
(@ ফ্লোটারক দ্বারা মন্তব্য করার জন্য ধন্যবাদ)
স্ট্রিং তুলনা সমাধান
যদি আপনি একটি লোহা-পরিহিত সমাধান চান তবে আপনার এমন পার্সার ব্যবহার এড়ানো উচিত যা মিথ্যা ইতিবাচক সাম্যের পরিচয় দিতে পারে; একটি স্ট্রিং বিরুদ্ধে প্রতিক্রিয়া বডি তুলনা করুন। উদাহরণ:
actual = response.body
expected = ({ foo: "bar" }).to_json
expect(actual).to eq expected
তবে এই দ্বিতীয় সমাধানটি কম দৃষ্টিভঙ্গিযোগ্য কারণ এটি সিরিয়ালযুক্ত জেএসওএন ব্যবহার করে যাতে প্রচুর পালানো উদ্ধৃতি চিহ্ন অন্তর্ভুক্ত থাকে।
কাস্টম ম্যাচার সমাধান
আমি নিজেকে একটি কাস্টম ম্যাচার লেখার প্রবণতা লিখি যা জিনস পাথগুলি পৃথকভাবে পুনরাবৃত্ত করার জন্য সুনির্দিষ্টভাবে পিনপয়েন্ট করার আরও ভাল কাজ করে। আপনার আরএসপেক ম্যাক্রোগুলিতে নিম্নলিখিতগুলি যুক্ত করুন:
def expect_response(actual, expected_status, expected_body = nil)
expect(response).to have_http_status(expected_status)
if expected_body
body = JSON.parse(actual.body, symbolize_names: true)
expect_json_eq(body, expected_body)
end
end
def expect_json_eq(actual, expected, path = "")
expect(actual.class).to eq(expected.class), "Type mismatch at path: #{path}"
if expected.class == Hash
expect(actual.keys).to match_array(expected.keys), "Keys mismatch at path: #{path}"
expected.keys.each do |key|
expect_json_eq(actual[key], expected[key], "#{path}/:#{key}")
end
elsif expected.class == Array
expected.each_with_index do |e, index|
expect_json_eq(actual[index], expected[index], "#{path}[#{index}]")
end
else
expect(actual).to eq(expected), "Type #{expected.class} expected #{expected.inspect} but got #{actual.inspect} at path: #{path}"
end
end
ব্যবহারের উদাহরণ 1:
expect_response(response, :no_content)
ব্যবহারের উদাহরণ 2:
expect_response(response, :ok, {
story: {
id: 1,
name: "Shire Burning",
revisions: [ ... ],
}
})
উদাহরণ আউটপুট:
Type String expected "Shire Burning" but got "Shire Burnin" at path: /:story/:name
নেস্টেড অ্যারেতে গভীরতা না দেখানোর জন্য আর একটি উদাহরণ আউটপুট:
Type Integer expected 2 but got 1 at path: /:story/:revisions[0]/:version
আপনি দেখতে পাচ্ছেন, আউটপুট আপনাকে ঠিক আপনার প্রত্যাশিত JSON ঠিক করতে কোথায় তা বলবে।